C++ try/catch

2025年5月1日 | 7 分钟阅读

在 C++ 编程中,异常处理 是使用 try/catch 语句来执行的。C++ 的 try 块用于放置可能发生异常的代码。catch 块则用于处理异常。

语法

它具有以下语法:

C++ 简单的 Try/Catch 示例

让我们来看一个例子,以说明 C++ 中的 try/catch 示例。

示例

编译并运行

输出

Exception caught: Division by zero is not allowed!! 

说明

在这个例子中,try 块试图将 n1 除以 n2,但因为 n2 是零,所以抛出了一个异常,信息为“不允许除以零!”。catch 块处理了这个异常并显示了错误信息,从而防止了程序崩溃。

try 块

C++ 中,try 块用于包裹可能在运行时导致错误的代码。换句话说,try 块包含可能导致运行时错误的代码,例如除以零、不当的内存访问或文件处理失败。它使得软件能够执行有潜在风险的操作,同时确保错误能被妥善处理。

Catch 块

在 C++ 中,catch 块紧跟在 try 块之后,用于处理在 try 块中抛出的异常。它指定了应如何处理特定的错误类型,从而避免程序意外终止,并允许有效地处理不同形式的异常。

  • 为了处理异常,try/catch 关键字通常成对使用。try 块包含可能产生错误的代码,而 catch 块则指定了如果发生错误该如何处理。
  • 在 C++ 中,每个 try 块至少需要一个 catch 块。catch 块之前必须有一个 try 块。这确保了异常能够被妥善处理,不会导致程序意外终止。

在 C++ 中使用 catch(...) 处理所有异常

在 C++ 中,如果我们不知道会抛出哪种类型的异常,我们可以使用 catch(...) 来处理所有异常。这确保了所有异常,无论其类型如何,都能被正确捕获和处理。

语法

它具有以下语法:

使用 Catch() 处理所有异常的 C++ 示例

让我们来看一个使用 catch() 函数处理所有异常的 C++ 示例。

示例

编译并运行

输出

ERROR!
Error: Division cannot be performed due to a wrong divisor.

说明

在这个例子中,我们尝试将被除数除以除数,同时处理潜在的异常。在 try 块内部,它检查除数是否为零,如果是,则抛出一个异常;否则,执行除法运算。catch() 块作为一个“全能捕获”处理程序,会拦截任何异常,并在除法出错时显示错误消息。

使用多个 Catch 块的 C++ 异常处理

在 C++ 中,我们可以在一个 try 块之后使用多个 catch 块来处理不同类型的异常。如果发生未知异常,catch(...) 块将会处理它。

语法

它具有以下语法:

使用多个 Catch 块的 C++ 异常处理示例

让我们来看一个使用多个 catch 块进行异常处理的 C++ 示例。

示例

编译并运行

输出

Enter the index: 3
Enter the numerator: 6
Enter the denominator: 0
ERROR!
Error: Cannot divide by zero!

说明

这个 C++ 程序进行除法运算并将结果存储在数组中,同时使用多个 catch 块管理异常。它首先判断用户提供的索引是否在界限内;如果不是,则抛出一个异常。如果分母为零,则会发出另一个异常,而最后的 catch(...) 块会捕获任何意料之外的错误,确保了流畅的错误处理。

函数中的 Try/Catch

在 C++ 中,异常可以在函数内部抛出,并在 main() 或其他调用函数中被捕获。我们可以在函数内部使用 try-catch 块来处理异常。当一个函数抛出异常时,程序会寻找最近的 catch 语句来处理它。

函数中 Try/Catch 的 C++ 示例

让我们来看一个 C++ 示例,以说明函数中的 try-catch。

示例

编译并运行

输出

Caught exception: Division by zero Exception!

说明

在这个例子中,函数 divide(int x, int y) 执行除法运算。在 main() 函数中,divide 函数在一个 try 块内被调用。当尝试进行除零操作时 (divide(15, 0)),该函数抛出一个异常,这个异常被处理 const char* 类型异常的 catch 语句捕获。

嵌套的 Try/Catch 块

在 C++ 中,嵌套的 try-catch 语句可以定义在另一个 try 块或 catch 块内部。这允许我们在不同代码段中发生不同异常的情况下处理异常。

语法

它具有以下语法:

C++ 嵌套 try/catch 块示例

让我们来看一个例子,以说明 C++ 中的嵌套 try/catch 块。

示例

编译并运行

输出

Outer try block started
Inner try block started
Caught in inner catch: Division by zero in inner block!
Caught in outer catch: Division by zero in inner block!
It continues after nested try-catch...

说明

在这个例子中,我们展示了嵌套的 try-catch 块,其中一个除零异常首先在内部的 catch 块中被捕获,然后被重新抛出,由外部的 catch 块处理。它展示了当异常在嵌套块之间传递时,控制流是如何进行的。

C++ Try/Catch 多选题

1) 在 C++ 中,以下哪个关键字用于指定一个函数会抛出任何异常?

  1. throwall
  2. throw
  3. throws
  4. throwexception

答案: b) throw


2) 以下哪个选项用于在 C++ 中实现异常处理?

  1. 使用 try-catch 块
  2. 使用错误处理计划
  3. 使用 Exception 关键字
  4. 使用 Exception 块

答案: a) 使用 try-catch 块


3) 如果在 try 块中没有抛出异常,会发生什么?

  1. catch 块被执行
  2. 程序崩溃
  3. 默认会抛出一个异常
  4. catch 块被跳过

答案: d) catch 块被跳过


4) 以下哪个选项是 C++ 中的一个异常?

  1. 没有写分号
  2. 变量未声明
  3. 除以零
  4. 表达式书写错误

答案: c) 除以零


5) 在 C++ 中,我们可以在没有 try 块的情况下使用 catch 块吗?

  1. 不能
  2. 是的
  3. 只能在函数内部
  4. 只能用于标准异常

答案: a) 不可以