我开发的c ++库存在问题:我定义了自己的异常类(基本上只包含一个字符串以返回what()调用),当没有捕获异常时,目标是操作系统将从what()打印消息并终止。这适用于Linux但在osX上,未显示异常消息(即它直接终止而不打印任何内容)。
那么,我是否正确地假设未捕获的异常将导致什么()后面的终止?我应该在osX上做什么,以便显示消息? (知道我不喜欢设置异常处理程序的想法,因为这会强制库的用户这样做)
谢谢! 的Mathias
答案 0 :(得分:0)
在所有操作系统上:捕获main()
中的异常并打印出适当的消息。如果你没有捕获它,则不确定是否在出路时运行析构函数。你真的想要吗?
答案 1 :(得分:0)
那么,我是否正确地假设未捕获的异常将导致什么()后面的终止?
没有。这些标准不需要未捕获的例外来打印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
,那么您当然可以这样做。但如果你不知道,你可能想要exit
。
同时
你正在写一个图书馆吗?并且您希望您的库能够终止应用程序背后的进程吗?...知道我不喜欢设置异常处理程序的想法,因为这会强制库的用户这样做
这可能是一个非常糟糕的主意。
但是如果你真的想这样做,上面的代码就可以了,你只需将它包裹在你的库的入口点而不是main
附近。