【发布时间】:2020-08-31 01:42:15
【问题描述】:
我有下面的例子。 (我的实际项目是一个多线程项目,我为所有项目设置了终止处理程序。)我有几个问题。
我的终止处理程序没有做任何花哨的事情。它只是说发生了错误并退出。我读到添加处理程序是一种好习惯。为什么会这样?在这种情况下我真的需要吗?
如果我没有处理程序,我会得到抛出的异常类型。
terminate called after throwing an instance of 'char const*'但是当我使用处理程序时,我无法得到它。即使我使用 current_exception,我也无法获得异常的类型。 (这里显然是 char*,但在我的情况下,它可能是任何东西,所以我无法正确捕捉。即使我使用 catch{...},消息和类型也会丢失)。反正有没有得到消息。如果不是消息,至少我可以得到抛出的异常类型吗?
// set_terminate example
#include <iostream>
#include <exception>
#include <cstdlib>
using namespace std;
void myterminate () {
cerr << "terminate handler called\n";
abort(); // forces abnormal termination
}
int main (void) {
//set_terminate (myterminate);
throw "TEST"; // unhandled exception: calls terminate handler
return 0;
【问题讨论】:
-
如果捕捉到异常,
std::terminate处理程序将不会被调用。 demo -
是的,没关系。我说的是获取未经处理的异常的类型
-
如果你想要你应该处理异常的类型。我怀疑使用
terminate_handler作为正确异常处理的替代品是一种好习惯。也许在一些晦涩难懂的嵌入式环境中,安装try..catch被认为过于昂贵......但是......不...... -
同意。就我而言,它是一个多线程系统,我不想对线程使用的每个方法进行尝试捕获。所以我对它们中的每一个都使用了 terminate_handler。如果我不使用它,我会得到异常类型,但如果我使用它,我不会得到类型。
-
如果您在每个线程中安装
terminate_handler,为什么不以try启动线程函数并以catch结束它以显示您捕获的内容?如果您仍然希望异常终止应用程序,您可以重新抛出或直接终止,〜同样的效果。如果您在许多地方以不同的方式分派线程,您可以将其包装在一个函数模板中,而不必键入它。
标签: c++11 exception terminate throw terminate-handler