C++ Exception::what()

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

健壮的 C++ 程序通常包括异常处理。在程序执行期间,当发生错误或异常情况时,C++ 允许用户通过使用 try、throw 和 catch 语句以优雅的方式处理它们。此机制的一个基本组件是 what() 函数,它是 std::exception 类的一部分。在这篇博客文章中,我们将深入探讨 exception::what() 函数,它的实现方式,并提供示例。

std::exception 的作用

在我们深入探讨 what() 函数之前,让我们简要讨论一下 std::exception 类。它是所有 C++ 异常的标准 catch 类,作为创建用户自定义异常对象的模板。

## 指令: 将给定句子从 AI 编写转换为人工编写:std::exception 有一个名为 what() 的成员函数,它生成一个 C 风格的字符串,指示异常的类型。

什么是 what() 函数?

在其核心,what() 函数的主要作用是提供对正在发生的异常的人类可读描述。此描述对于日志记录、调试或向最终用户呈现错误消息非常宝贵。

语法

what() 函数的声明如下:

分解函数签名:

  • virtual: 表示该函数可以被派生类覆盖。
  • const char*: 返回类型,一个指向常量字符的指针,封装了一个 C 风格的字符串。
  • const noexcept: 指示该函数不会抛出异常的修饰符。

实现和覆盖

在自定义异常类中,覆盖变得至关重要,以利用 what() 函数的强大功能。考虑一个场景,其中创建了一个名为 CustomException 的自定义异常类,继承自 std::exception:

在此示例中,CustomExceptionwhat() 函数被覆盖,以为此异常实例提供量身定制的错误消息。

使用 Exception::what()

现在,让我们探讨 exception::what() 在 try-catch 块中的实际应用:

输出

Caught an exception: Custom exception: Something went wrong!

说明

在这里,try 块中抛出了一个 CustomException 实例。catch 块通过引用 std::exception 捕获异常,并将 what() 的结果输出到标准错误流。

实际应用

考虑一个更实际的场景,其中异常处理应用于负责除以两个数字的函数。如果尝试除以零,则会触发自定义异常 DivideByZeroException

示例

输出

Caught an exception: Division by zero error!

结论

总而言之,所提供的 C++ 代码有力地说明了异常处理在优雅地管理意外错误方面所发挥的关键作用。自定义异常类 "DivideByZeroException" 扩展了标准 "std::exception" 类,展示了用户定义异常的实用性。"DivideByZeroException" 类中被覆盖的 "what()" 函数提供了详细的错误消息,提高了异常处理过程的易懂性。

在 main 函数中,除法运算被封装在一个 try 块中。如果遇到除以零的情况,则会策略性地抛出自定义异常。随后的 catch 块巧妙地捕获了异常,并且程序通过利用 "e.what()" 发出清晰且信息丰富的错误消息。

此示例强调了针对特定场景定制异常类以及利用 "what()" 函数在运行时错误期间传达精确信息的重要性。此类实践有助于有效的调试并增强向开发人员和最终用户传达错误详细信息。正如在此代码片段中所示,异常处理是创建弹性且易于理解的 C++ 程序不可或缺的工具。