【问题标题】:How to catch exceptions (gcc arm c++)如何捕获异常(gcc arm c++)
【发布时间】:2014-05-04 16:54:07
【问题描述】:

我使用 marmalade sdk,但不支持结构化异常处理。我需要捕获任何异常(空指针、除零或任何其他)并在应用程序崩溃之前执行一些操作(发送崩溃报告)。如何在 gcc-arm 编译器下的原生 c++ 中做到这一点?

【问题讨论】:

  • 你尝试了什么?哪里失败了??
  • 游戏应用程序有一个错误,但在重新加载并执行相同操作后不会重复。我想存储用户在应用崩溃之前完成的一些最后的游戏操作,然后通过电子邮件发送。

标签: c++ exception gcc arm marmalade


【解决方案1】:

我已经问过了here。我在options 中使用标志enable-exceptions=1 进行了尝试。但它从来没有为我工作过。 Marmalade 上有一个关于异常处理的帖子,其中提到 Marmalade 不支持它们,社区要求将其包括在内。

【讨论】:

  • enable-exceptions 仅适用于标准 c++ 异常,但空指针和分段错误不是 c++ 异常。我试图捕捉分段错误信号,但信号处理程序没有调用果酱。 icf文件或其他任何地方可能有编译器的任何配置来打开信号?
【解决方案2】:

我需要捕捉任何异常

为此,您可以使用catch 的省略号语法:

try {
    doStuff(); // May throw
}
// catch all exceptions derived from std::exception
catch(const std::exception& ex) { 
    std::cerr << "Caught exception: '" << ex.what() << "'" << std::endl;
}
catch(...) { // catch everything but unkown
}

还要确保您的构建系统不会使用-fno-exceptions-fno-rtti 编译器标志显式抑制异常和RTTI。

【讨论】:

  • int main() { 尝试 { int* p = NULL; *p = 5; } catch (...) { } } //此代码不起作用,因为这不是标准的 c++ 异常,但我需要捕获此类异常
  • 取消引用 NULL 指针不会引发异常。这样做只是UB。恐怕您需要在代码中添加 assert() 调用才能赶上此类错误。
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多