C++ 中未捕获异常的自定义终止行为

2024 年 8 月 29 日 | 阅读 3 分钟

在本文中,您将学习如何在 C++ 中自定义未捕获异常的终止行为。

在 C++ 中,std::set_terminate 方法允许应用程序在发生未捕获异常时具有自定义响应。它使您能够指定一个唯一的处理程序,该处理程序将在未处理的异常导致程序终止时被调用。

以下是一些关于修改 C++ 未捕获异常终止行为的思考

  1. set_terminate (std::) 函数: 当未处理的异常导致 terminate 函数被调用时,您可以使用此函数设置一个自定义终止处理程序,该处理程序将被触发。
  2. 自定义终止处理程序: 您可以使用 std::set_terminate 建立一个自定义终止处理程序,以指定一个函数,该函数将在程序因未捕获异常而终止时运行。在程序结束之前,此处理程序可以完成日志记录、清理或执行其他基本任务。
  3. std::terminate 与函数: 在发生未处理异常时,运行时会调用 std::terminate 函数,该函数默认使用 std::abort 终止程序。您可以通过自定义终止行为来提供您的操作,而不是使用默认终止。
  4. 异常处理策略: 在需要为处理异常情况设置特定协议的情况下,自定义未捕获异常的终止行为特别有用。这些协议的一些示例包括记录错误数据、释放资源或在程序终止前尝试正常终止。
  5. 灵活性和控制: 您可以指定在发生未处理异常时必须遵循的策略和过程,从而更好地控制程序如何处理异常情况。您还可以修改终止行为。
  6. 异常处理和清理: 您可以通过自定义终止行为来确保在程序停止之前完成任何必要的清理或日志记录。这在优雅地处理未捕获异常时特别有用。

使用 std::set_terminate 设置自定义终止处理程序可以提高代码的健壮性和可靠性。它将确保您的程序在因未处理的异常而结束之前处理某些任务。

示例

让我们举一个例子来说明 C++ 中的 std::set_terminate 函数。

输出

Exception caught: Custom uncaught exception occurred.

说明

1. 自定义终止处理程序 (customTerminationHandler 函数)

在此示例中,customTerminationHandler 方法用于创建自定义终止处理程序。

您将此函数定义为唯一的终止处理程序。由于未处理的异常,它在程序结束前被调用。

为了让您知道自定义终止处理程序正在运行,处理程序内部会打印一条消息。

2. 主函数 (main 函数)

在主函数中,std::set_terminate(customTerminationHandler) 用于设置自定义终止处理程序。它将程序因未处理异常而终止与 customTerminationHandler 关联起来。

3. Catch-Try 块

在 try 块内部抛出 std::runtime_error 类型的异常。由于没有匹配的 catch 块可以直接处理它,因此此异常仍未被捕获。

当发生未处理异常时,程序会触发自定义终止处理程序 customTerminationHandler 函数。该处理程序执行其任务,包括执行 std::exit(EXIT_FAILURE) 以优雅地结束程序并打印一条消息。

4. Catch 块

不可能捕获 std::runtime_error 异常。但是,std::exception 类型的异常会在通用 catch 块中捕获。在这里,打印异常的消息(使用 e.what() 检索)和一条表示它已被捕获的消息。

5. 程序逻辑

程序逻辑或清理操作可以在 try-catch 块之后进行。从“Other program logic or cleanup actions”注释中可以看出,这些操作在此特定示例中不会执行,因为程序由自定义终止处理程序终止。