在C++中通过多个catch子句捕获不同异常类型,如int、double或自定义异常,按顺序匹配处理,确保每种异常被正确响应。

在C++中,捕获多个异常可以通过在try-catch块中使用多个catch子句来实现。每个catch子句可以处理不同类型的异常,程序会按照它们出现的顺序依次匹配异常类型。
按异常类型分别捕获
你可以为每种可能抛出的异常类型编写独立的catch块。例如,一个函数可能抛出int、double或自定义类异常:
try {
// 可能抛出异常的代码
throw 42; // 抛出 int
// throw std::runtime_error("error"); // 或抛出标准异常
}
catch (int e) {
std::cout << "捕获到整型异常: " << e << std::endl;
}
catch (double e) {
std::cout << "捕获到浮点型异常: " << e << std::endl;
}
catch (const std::exception& e) {
std::cout << "标准异常: " << e.what() << std::endl;
}
catch (...) {
std::cout << "捕获到未知异常" << std::endl;
}
注意:异常匹配遵循从上到下的顺序,因此更具体的异常应放在前面,避免被泛化的catch(...)提前捕获。
捕获自定义异常类
如果你定义了多个自定义异常类,可以通过继承std::exception并分别捕获:
立即学习“C++免费学习笔记(深入)”;
struct MyException1 : public std::exception {
const char* what() const noexcept override { return "MyException1"; }
};
struct MyException2 : public std::exception {
const char* what() const noexcept override { return "MyException2"; }
};
try {
throw MyException1();
}
catch (const MyException1& e) {
std::cout << "处理 MyException1: " << e.what() << std::endl;
}
catch (const MyException2& e) {
std::cout << "处理 MyException2: " << e.what() << std::endl;
}
使用 catch(...) 捕获所有异常
catch(...)可以捕获任何类型的异常,通常作为最后的兜底处理:
catch (...) {
std::cout << "发生未预期的异常" << std::endl;
// 可在此记录日志或清理资源
}
但无法获取异常的具体信息,因此建议仅用于确保程序不崩溃或重新抛出。
重新抛出异常
在捕获异常后,若需交由上级处理,可使用throw;重新抛出:
catch (const std::exception& e) {
std::cout << "日志记录: " << e.what() << std::endl;
throw; // 保持原始异常类型和栈状态
}
基本上就这些。合理组织多个catch块,结合标准异常、自定义异常与catch(...),就能有效处理C++中的多异常场景。










