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
}
如果你真的想要,比如,_exit
或abort
(甚至是terminate
)而不是exit
ing,你当然可以这样做。但如果你不知道,你可能想要exit
。
与此同时:
...知道我不喜欢设置异常处理程序的想法,因为这会强制库的用户执行它
你在写一个图书馆?并且您希望您的库能够终止应用程序背后的进程吗?
这可能是一个非常糟糕的主意。
但是如果你真的想要这样做,上面相同的代码将起作用,你只需将它包装在你的库的入口点而不是main
周围。
在所有操作系统上:捕获main()
中的异常并打印出适当的消息。如果你没有捕获它,则不确定是否在出路时运行析构函数。你真的想要吗?
以上是关于osx上的c ++未捕获异常的主要内容,如果未能解决你的问题,请参考以下文章