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()获取当前异常类型的名称.
作为约翰Zwinck建议注释catch(...)块以让运行时终止应用程序并希望提供更多信息的变体,你可以
catch (...)
{
log("Unknown exception caught in [sensible info here]; will rethrow it");
throw;
}
Run Code Online (Sandbox Code Playgroud)
然后你至少会知道你的程序在哪里发生错误(如果有几种可能性).