我开发的 C++ 库有一个问题:我定义了自己的异常类(基本上只包含一个要为 what() 调用返回的字符串),当没有捕获到异常时,目标是操作系统会从 what() 打印消息并终止。这在 Linux 上运行良好,但在 osX 上,不显示异常消息(即它直接终止而不打印任何内容)。
那么,我是否正确地假设未捕获的异常会导致 what() 然后终止?我应该在 osX 上做什么才能显示消息?(知道我不喜欢设置异常处理程序的想法,因为这会迫使库的用户这样做)
谢谢!马蒂亚斯
我开发的 C++ 库有一个问题:我定义了自己的异常类(基本上只包含一个要为 what() 调用返回的字符串),当没有捕获到异常时,目标是操作系统会从 what() 打印消息并终止。这在 Linux 上运行良好,但在 osX 上,不显示异常消息(即它直接终止而不打印任何内容)。
那么,我是否正确地假设未捕获的异常会导致 what() 然后终止?我应该在 osX 上做什么才能显示消息?(知道我不喜欢设置异常处理程序的想法,因为这会迫使库的用户这样做)
谢谢!马蒂亚斯
那么,我是否正确地假设未捕获的异常会导致 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
)而不是exit
ing,你当然可以这样做。但如果你不知道,你可能想要exit
.
同时:
…知道我不喜欢设置异常处理程序的想法,因为这会迫使库的用户这样做
你在写一个库?并且您希望您的库能够终止应用程序背后的进程?
这可能是一个非常糟糕的主意。
但是如果你真的想这样做,上面的相同代码也可以工作,你只需要将它包装在你的库的入口点而不是main
.
在所有操作系统上:捕获异常main()
并打印出任何适当的消息。如果你没有抓住它,则未指定析构函数是否在出路时运行。你真的想要那个吗?