C++ 程序处理已检查的异常

17 Mar 2025 | 4 分钟阅读

异常是在程序执行期间发生的意外事件,它会停止程序的正常流程。异常分为受检异常和非受检异常两种。受检异常是编译时异常,因为编译器会在编译时检查这些异常,而编译器不检查非受检异常。

在 C++ 中,没有像 Java 等其他语言中受检异常的概念。在 C++ 中,异常是非受检的,这意味着你可以从任何函数抛出任何类型的异常,并且你不需要声明函数可能抛出的异常。程序员负责处理异常。因此,程序员必须使用 try、catch 和 throw 关键字来处理预期,并使用 try 块抛出导致异常的对象类型。

为什么 C++ 编译器不检查异常?

C++ 是 C 语言的扩展版本,但 C 语言不支持异常。因此,如果实现异常,它们会破坏现有的 C 程序。

在编译时检查异常将使编译器分析流程图,从而增加计算和运行时。这种开销不适用于性能敏感的应用程序。

C++ 允许程序员选择何时何地处理异常。这种灵活性使得 C++ 在编译级别不检查异常。

示例 1

让我们以一个例子来说明如何处理受检异常。

输出

C++ program to handle the checked exceptions

说明

程序中的变量是ab,它们表示从用户那里获取的分子和分母。

Division 和 main 是程序中的两个函数。Division 函数有两个参数,ab。它的返回类型是 int,它给出 a 和 b 的除法。这个程序使用 try、catch 和 throw 关键字的错误处理概念。try 块包含可能产生错误的代码,catch 块包含错误消息。throw 关键字用于抛出错误消息。

示例 2

让我们再举一个例子来说明如何处理受检异常。

输出

C++ program to handle the checked exceptions

说明

在这个例子中,程序包含几个函数,包括 BankAccount() 构造函数、deposit()、withdraw()、transfer()getBalance() 函数。

在这里,deposit() 函数将金额作为输入,并检查金额是否为负。如果为负,它将抛出 invalid_argument 异常。否则,它会将余额增加存款金额。

withdraw() 函数将金额作为输入。如果为负,它会抛出 invalid_argument 异常。否则,它会将余额减少提款金额。如果提款金额超过余额,它会抛出 insufficientFundsException 消息。

transfer() 函数将金额和另一个 BankAccount 对象的引用作为输入。它尝试从当前账户中提取指定金额。如果成功,则将金额存入收款人的账户。如果在提款过程中捕获到 InsufficientFundsException,它会通过打印错误消息来处理异常。它会打印一条消息,指示转账操作。

错误处理概念

  • transfer 函数中,try 块尝试提款和转账操作。
  • 如果在提款过程中捕获到 InsufficientFundsException,它会在 catch 块中处理,其中会打印错误消息。
  • main 函数中,类似的 try-catch 块用于捕获在操作过程中可能抛出的任何异常。

结论

总之,C++ 通过 try、catch 和 throw 提供了强大的异常处理机制,使开发人员能够优雅地管理意外事件。与 Java 不同,C++ 不强制执行受检异常,允许程序员根据其特定的应用程序需求处理异常。通过使用 try-catch 块,C++ 开发人员可以保护他们的程序免受运行时错误的影响,并保持对程序流程的控制。这些示例演示了如何抛出、捕获和处理异常,从而在面对异常情况时增强 C++ 应用程序的可靠性和健壮性。理解和应用异常处理原则对于在 C++ 中创建稳定、用户友好的软件至关重要。