使用 C++ / GCC / Linux 有时无法捕获异常

问题描述 投票:0回答:2

偶尔会遇到一段代码没有捕获异常。到目前为止我不知道可能的原因是什么。

以下代码为例。

  • 打印日志消息“正在初始化”。
  • 打印来自 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

有什么我不知道的事情可能会导致异常未被捕获吗?

c++ exception gcc arm
2个回答
1
投票

其实忽略了头文件中的一些东西。该函数被标记为“noexcept”,实际上在抛出异常时导致终止。


0
投票

我发现 catch(...) 可以捕获 Windows 中 C++ 中的除零错误和错误指针错误。但在 Linux 中,我就不走运了。程序将会崩溃。我对此无能为力。但如果能知道错误在哪里,或者甚至像 C# 那样显示堆栈跟踪,那就太好了。

我发现 Linux 在转储程序之前会向该程序发送一个 信号。我可以捕获该信号并显示错误消息。我尝试使用 setjmplongjmp 从信号转回主程序,但我发现程序快要死了,没有什么可以拯救它。

我编写这个项目是为了演示如何使用 signal 命令捕获错误并显示错误发生位置的堆栈跟踪。

https://notabug.org/RussellHankins/ShowErrorsInC-Linux

© www.soinside.com 2019 - 2024. All rights reserved.