捕获所有异常的处理程序
本课属于 Coddy C++ 学习旅程的“逻辑与流程”单元。第 52 课,共 56 课。
有时,你的程序可能会遇到意料之外的错误,这些错误不属于你预先考虑的特定异常类型。兜底处理程序 catch(...) 可以提供一层保护,用来捕获那些未被更具体的 catch 代码块处理的任何异常。
通用处理程序使用三个点 (...),而不是指定某种特定的异常类型。它必须放在所有其他 catch 块之后,因为 C++ 会按顺序检查它们:
try {
// 可能抛出各种异常的代码
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}通用处理程序会作为后备处理程序,捕获前面代码块未捕获的任何类型的异常。处理可能抛出你未预料到的异常的代码时,这尤其有用,可以确保程序不会因意外错误而崩溃。
虽然你无法在全捕获代码块中访问异常的具体信息,但仍可以提供通用的错误消息并执行清理操作,让程序顺利运行。
挑战
简单创建一个程序,使用多个 catch 块(包括兜底处理程序)来演示全面的异常处理。这个挑战将测试你对如何处理特定异常类型和不属于预定义类别的意外错误的理解。
将提供以下输入:
- 一个字符串
testType,表示要执行的测试类型("string_convert"、"math_operation"、"array_access"或"unknown_error") - 一个字符串
value1,将用作操作的主要数据 - 一个字符串
value2,将用作某些操作的辅助数据
你的程序应当:
- 创建一个名为
performTest的函数,该函数接受三个字符串参数 - 在函数内部,使用 if-else 结构处理不同的测试类型:
- 如果 testType 是
"string_convert":使用std::stoi将 value1 转换为整数并打印 - 如果 testType 是
"math_operation":使用std::stoi将 value1 和 value2 都转换为整数,然后用 value1 除以 value2 并打印结果 - 如果 testType 是
"array_access":创建一个字符串"Programming",使用std::stoi将 value1 转换为整数索引,然后使用str.at(index)访问该索引处的字符并打印。索引无效时,.at()方法会自动抛出std::out_of_range:不需要手动进行边界检查 - 如果 testType 是
"unknown_error":抛出整数值999 - 在 main 函数中,在
try块内调用performTest - 使用多个
catch块按以下确切顺序处理异常: - 第一:对无效的字符串转数字转换使用
std::invalid_argument& - 第二:对过大的数字或超出字符串索引范围的情况使用
std::out_of_range& - 第三:使用
catch(...)作为其他所有异常类型的兜底处理程序
使用以下确切的输出格式:
操作成功时:
Success: [result_value]发生不同类型的异常时:
Invalid argument caught
Out of range caught
Unknown exception caught请记住,兜底处理程序 catch(...) 必须放在最后,因为 C++ 会按顺序检查 catch 块。它会捕获之前的特定 catch 块未处理的任何异常类型,包括在 "unknown_error" 情况下抛出的整数异常。兜底处理程序为意外错误提供了安全保障,同时仍允许对已知异常类型进行特定处理。
亲手试试
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO:在这里编写代码,创建 performTest 函数
int main() {
// 读取输入
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO:在下方编写代码,实现 try-catch 代码块并调用 performTest
return 0;
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: C++ 在线编译器