C++未处理的异常

Yip*_*Yay 7 c++ exception handler

如果出现未处理的异常,C++是否提供了一种"显示"可视化内容的方法?

我想做的是做一些事情,assert(unhandled exception.msg())如果它真的发生(如下面的例子):

void foo() {
   throw std::exception("Message!");
}

int main() {
 foo();
}
Run Code Online (Sandbox Code Playgroud)

我希望这种代码不会立即终止(因为异常未处理),而是显示自定义断言消息(Message!实际上).

那可能吗?

Log*_*ldo 11

标准没有指定实际显示未捕获异常的消息.但是,在许多平台上,无论如何都是可能的.在Windows上,您可以使用SetUnhandledExceptionFilter并提取C++异常信息.使用g ++(无论如何适当的版本),终止处理程序可以使用以下代码访问未捕获的异常:

   void terminate_handler()
   {
       try { throw; }
       catch(const std::exception& e) { log(e.what()); }
       catch(...) {}
   }
Run Code Online (Sandbox Code Playgroud)

事实上,g ++的默认终止处理程序做了类似的事情.您可以使用set_terminate设置终止处理程序.

简而言之,没有通用的C++方式,但有些方法取决于您的平台.


Ste*_*end 6

微软的Visual C++允许你勾未处理的C++异常喜欢这个.这是标准的STL行为.

您通过调用设置处理程序set_terminate.建议您的处理程序不要工作,然后终止程序,但我不明白为什么你不能通过断言发出信号 - 虽然你没有访问导致问题的异常.


Chr*_*unt 5

我认为您将从如下的包罗万象的声明中受益:

int main() {
 try {
   foo();
 catch (...) {
   // Do something with the unhandled exception.
 }
}
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,异常本身不可用于此方法中的内省。那是因为您可能不会抛出“std::Exception”实例,C++ 允许您抛出任何类型的值,例如“int”或其他任何类型。您可以通过在“catch (...)”或您可能希望捕获的任何类型之前添加“catch (std::exception &e)”来解决此问题。 (6认同)