从catch(...)捕获的异常中获取一些信息?

Beg*_*ner 14 c++ exception-handling

我有一个try catch子句,其中最外层catch(...)从未发生过.经过一些更改后,某个地方会抛出一个我无法处理其他情况的异常.有没有办法获得至少一些关于异常的信息,即使我抓住了它(...)

catch (const cone::BeginnersLibException& ex) 
{
    // handle the exception
}
catch (const std::exception& ex) 
{
    // handle std exception
} 
catch (...) 
{
    log("Unknown exception caught.");
    // How can I get more information about this exception?
}
Run Code Online (Sandbox Code Playgroud)

编辑:这里有一个适合我的代码片段:

#include <cxxabi.h>

// more code here 
} catch (...) {
    std::string exName(abi::__cxa_current_exception_type()->name());
    std::cout<<"unknown exception: "<< exName <<std::endl;
    throw;
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*nck 17

您可以使用gdb或其他调试器执行此操作.告诉调试器在抛出任何异常时停止(在gdb中命令很有趣catch throw).然后,您不仅会看到异常的类型,还会看到它的确切位置.

另一个想法是注释掉catch (...)并让你的运行时终止你的应用程序,并希望告诉你更多关于异常的信息.

一旦你弄清楚异常是什么,你应该尝试用派生的东西替换或扩充它std::exception.不必catch (...)在所有不是很大.

如果您使用GCC或Clang,您还可以尝试__cxa_current_exception_type()->name()获取当前异常类型的名称.


Wal*_*ter 5

作为约翰Zwinck建议注释catch(...)块以让运行时终止应用程序并希望提供更多信息的变体,你可以

catch (...) 
{
  log("Unknown exception caught in [sensible info here]; will rethrow it");
  throw;
}
Run Code Online (Sandbox Code Playgroud)

然后你至少会知道你的程序在哪里发生错误(如果有几种可能性).