【发布时间】:2026-02-05 18:40:01
【问题描述】:
我正在用 C++ 编写一个命令行应用程序。如果发生未处理的异常,我不希望应用程序严重崩溃,而是尽可能清理并打印错误消息。
我应该如何在顶层捕获异常以避免程序崩溃?我应该抓住std::exception、... 还是别的什么?
【问题讨论】:
-
您应该捕获应用程序将抛出的任何异常。由于您是编写应用程序的人,因此只有您(而且 *.com 上没有其他人)可能知道您未来的应用程序可能会抛出哪些异常。
-
请注意,如果在异常向上传播时发生堆栈展开,则它是由实现定义的。如果你等到
main,你可能无法清理任何东西。 -
@NathanOliver - 如果在
main中捕获 异常,一切都会得到适当的清理。只有当它从main传播(即,terminate被调用,因为没有异常处理程序)时,它可能会或可能不会破坏自动对象。 -
@PeteBecker 我的印象是,如果异常是在调用链中引发的,并且它会向后传播调用链,以寻找它实现定义的处理程序,如果它在途中展开调用堆栈备份。不是这样吗?调用链下游的本地函数对象会得到正确处理吗?
-
@NathanOliver - 当捕获到异常时,调用链下游的自动变量都已被销毁。这是 RAII 的基础。
标签: c++ exception exception-handling