繁体   English   中英

osX上的C ++未捕获异常

[英]c++ uncaught exceptions on osX

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

因此,我是否正确地假设未捕获的异常会导致what()之后终止? 我应该在osX上做什么以便显示该消息? (知道我不喜欢设置异常处理程序的想法,因为这强加了库的用户执行此操作)

谢谢! 马蒂亚斯

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

因此,我是否正确地假设未捕获的异常会导致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
}

如果您真的想_exitabort (甚至terminate )而不是exit ,则可以这样做。 但是,如果您不知道,则可能要exit

与此同时:

…知道我不喜欢设置异常处理程序的想法,因为这迫使图书馆的用户去做

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

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

但是,如果您确实想这样做,则可以使用上面相同的代码,只需将其包装在库的入口点周围,而不是在main周围即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM