0

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

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

谢谢!马蒂亚斯

4

2 回答 2

0

那么,我是否正确地假设未捕获的异常会导致 what() 然后终止?

不,标准不要求打印出未捕获的异常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()" << "\n";
    exit(1);
  } catch (...) {
    std::cerr << "exception not derived from std::exception\n";
    exit(1);
  }
}

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

如果你真的想,说,_exit或者abort(甚至terminate)而不是exiting,你当然可以这样做。但如果你不知道,你可能想要exit.

同时:

…知道我不喜欢设置异常处理程序的想法,因为这会迫使库的用户这样做

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

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

但是如果你真的想这样做,上面的相同代码也可以工作,你只需要将它包装在你的库的入口点而不是main.

于 2012-09-21T19:26:26.903 回答
0

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

于 2012-09-21T19:10:51.993 回答