【发布时间】:2010-03-24 12:47:02
【问题描述】:
在某些情况下——尤其是在堆栈展开期间异常从析构函数中转义时——C++ 运行时调用terminate(),它必须做一些合理的事后分析,然后退出程序。当出现“为什么如此苛刻”的问题时,答案通常是“在这种错误情况下没有比这更合理的做法了”。如果整个程序都是 C++ 的话,这听起来很合理。
如果 C++ 代码在库中,而使用该库的程序不在 C++ 中,该怎么办?这种情况经常发生 - 例如,我可能有一个由 .NET 程序使用的本机 C++ COM 组件。一旦在组件代码中调用terminate(),.NET 程序就会突然异常结束。程序作者首先会想到“我不关心C++,为什么这个库让我的程序退出?”
在使用 C++ 开发库时如何处理后一种情况? terminate()意外结束程序合理吗?有没有更好的方法来处理这种情况?
【问题讨论】:
-
嗯。不要打电话给
terminate(),或者做任何定义为打电话给terminate()的事情?同样的问题是否适用于exit()、abort()、引发 SIGKILL 或未定义的行为?如果您的文档说一个函数将返回,但它没有返回,那就是一个错误。程序作者首先认为“为什么这个库让我的程序退出”是正确的,其次是追捕你并要求报复。 -
@Steve:你应该这样回答!
-
@Steve Jessop:我不叫
terminate()- C++ 运行时会。 -
因为您的图书馆所做的事情 - 不要这样做。
标签: c++