osx上的c ++未捕获异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了osx上的c ++未捕获异常相关的知识,希望对你有一定的参考价值。

我有一个我开发的c ++库的问题:我定义了自己的异常类(基本上只包含一个字符串来返回what()调用),当没有捕获异常时,目标是操作系统会从what()打印消息并终止。这适用于Linux但在osX上,未显示异常消息(即它直接终止而不打印任何内容)。

那么,我是否正确地假设未被捕获的异常将导致什么()后面的终止?我应该在osX上做什么,以便显示消息? (知道我不喜欢设置异常处理程序的想法,因为这会强制库的用户这样做)

谢谢!马蒂亚斯

答案

那么,我是否正确地假设未被捕获的异常将导致什么()后面的终止?

不会。这些标准不需要未经授权的例外来打印what()。事实上,他们很难(但并非不可能)编写始终如此的符合要求的实现。

真的没有什么好办法可以做你想要做的事情(打印出what(),只有在这种情况下执行不会这样做,然后继续进行terminate(),好像异常从未被捕获过)。但那可能不是你真正想要的。

这可能是你想要的:

#import <exception>
#import <iostream>

int real_main(int argc, char *argv[]);

int main(int argc, char *argv[]) {
  try {
    return real_main(argc, argv);
  } catch (std::exception &e) {
    std::cerr << "exception: e.what()" << "
";
    exit(1);
  } catch (...) {
    std::cerr << "exception not derived from std::exception
";
    exit(1);
  }
}

int real_main(int argc, char *argv[])
{
    // real main code goes here
}

如果你真的想要,比如,_exitabort(甚至是terminate)而不是exiting,你当然可以这样做。但如果你不知道,你可能想要exit

与此同时:

...知道我不喜欢设置异常处理程序的想法,因为这会强制库的用户执行它

你在写一个图书馆?并且您希望您的库能够终止应用程序背后的进程吗?

这可能是一个非常糟糕的主意。

但是如果你真的想要这样做,上面相同的代码将起作用,你只需将它包装在你的库的入口点而不是main周围。

另一答案

在所有操作系统上:捕获main()中的异常并打印出适当的消息。如果你没有捕获它,则不确定是否在出路时运行析构函数。你真的想要吗?

以上是关于osx上的c ++未捕获异常的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的异常 - 调试技术(C ++)

基类未捕获 C++ 异常

在 C#.NET 中捕获所有未处理异常的简单方法

基类未捕获 C++ 派生类异常

C++ MSVC - 显示未捕获的异常消息

Android_程序未处理异常的捕获与处理