偶尔我会遇到一段代码,其中没有捕获异常。到目前为止,我不知道可能的原因是什么。
下面是一段代码的例子。
- 打印日志消息“初始化”。
- 打印来自module->Init()的一些日志消息
- module->init()抛出异常
- catch块中的日志消息不打印
应用程序终止
log::trace( "Initializing" );
try
{
module->Init();
}
catch( const std::exception& e )
{
log::error( "Error initializing module:{}", e.what());
}
catch( ... )
{
log::error( "Unknown exception initializing module" );
}
dmesg:
[ 9.557049] terminate called after throwing an instance of '
[ 9.562655] std::runtime_error
[ 9.565715] '
[ 9.567350] what():
followed by the error message passed to what() which was the generated exception message in init.
字符串
- 异常处理在同一应用程序的其他部分按预期工作。
- 从主线程引发异常。
- 嵌入式ARM平台搭建系统。所有库都使用相同的编译器编译。
- 编译器使用GCC 8.2.0
有没有什么我不知道的,可能会导致异常没有被捕获?
2条答案
按热度按时间wgmfuz8q1#
实际上忽略了头文件中的一些东西。该函数被标记为“noexcept”,这实际上在抛出异常时导致终止。
2w3rbyxf2#
我发现catch(...)在Windows中捕获C++中的除零错误和坏指针错误。但是在Linux中,我运气不好。程序要崩溃了。我对此无能为力。但如果能知道错误在哪里,或者甚至像C#那样显示堆栈跟踪,那就太好了。
我发现Linux在转储之前会向程序发送一个signal。我可以捕获该信号并显示错误消息。我试着用setjmp和longjmp从信号中逃回主程序,但我发现程序会死,没有什么可以保存它。
我写这个项目是为了演示如何用signal命令捕获错误,并显示错误发生的堆栈跟踪。
https://github.com/RussellHankins/ShowErrorsInC-Linux的