多重catch语句按顺序捕获异常,应将具体类型放在前面、使用const引用避免拷贝,catch(...)置于最后以捕获未知异常。

在C++中,多重catch语句用于处理可能抛出的不同类型的异常。当try块中发生异常时,程序会按顺序检查每个catch块,直到找到匹配的异常类型为止。定义多重catch语句的关键是使用多个catch子句,每个子句捕获不同类型的异常。
基本语法结构
try-catch结构的基本写法如下:
try {
// 可能抛出异常的代码
} catch (const Type1& e) {
// 处理Type1类型的异常
} catch (const Type2& e) {
// 处理Type2类型的异常
} catch (...) {
// 捕获所有其他未处理的异常(通配符)
}
捕获多种常见异常类型
C++标准库中常见的异常类型包括std::runtime_error、std::logic_error、std::out_of_range等。你可以为每种类型编写独立的catch块:
- 按引用捕获可以避免对象 slicing,并提高效率
- 派生类异常应放在基类之前,防止被覆盖
示例代码:
立即学习“C++免费学习笔记(深入)”;
#include#include #include int main() { std::vector vec = {1, 2, 3}; try { throw std::out_of_range("索引越界"); } catch (const std::out_of_range& e) { std::cout << "捕获到越界异常: " << e.what() << std::endl; } catch (const std::runtime_error& e) { std::cout << "运行时错误: " << e.what() << std::endl; } catch (const std::exception& e) { std::cout << "标准异常: " << e.what() << std::endl; } catch (...) { std::cout << "未知异常被捕获" << std::endl; } return 0; }
注意事项与最佳实践
编写多重catch语句时应注意以下几点:
- 异常匹配是按顺序进行的,因此更具体的异常类型必须写在前面
- 推荐使用const引用方式捕获异常,避免不必要的拷贝和 slicing
- catch(...) 必须放在最后,否则会导致后续catch块无法到达
- 自定义异常类也应遵循继承体系合理排列顺序
基本上就这些。只要按照类型从具体到抽象的顺序组织catch块,就能正确处理各种异常情况。











