C++异常抛出与捕获的核心机制通过try
、throw
、catch
三个关键字实现,确保程序在异常情况下的健壮性和可维护性。以下是关键要点:
一、基本结构
-
try块 :包裹可能抛出异常的代码段,需与
catch
块配合使用。 -
throw关键字 :显式抛出异常,需指定异常对象或类型(如
throw std::runtime_error("错误信息")
)。 -
catch块 :捕获并处理异常,可指定异常类型(如
catch(const std::runtime_error& e)
)。
二、异常类型与标准库
-
标准库提供多种异常类,如
std::runtime_error
(运行时错误)、std::out_of_range
(范围错误)等。 -
可自定义异常类,继承自
std::exception
并重写what()
方法返回错误信息。
三、异常处理技巧
-
多级捕获 :针对不同异常类型使用不同
catch
块,优先捕获具体异常再使用通配符catch(...)
。 -
异常安全 :通过RAII(资源获取即初始化)机制确保异常发生时资源正确释放,避免内存泄漏。
-
避免资源泄漏 :抛出异常时避免使用
new
分配对象,推荐使用栈分配或智能指针。
四、注意事项
-
异常必须显式抛出才能被捕获,未抛出异常时无法触发处理逻辑。
-
try
、catch
块需成对出现,且中间不可插入其他语句。
示例代码
#include <iostream>
#include <stdexcept>
void checkAge(int age) {
if (age < 0 || age > 120) {
throw std::invalid_argument("年龄必须在0-120岁之间");
}
std::cout << "年龄合法: " << age << std::endl;
}
int main() {
try {
checkAge(-5);
} catch (const std::invalid_argument& e) {
std::cerr << "错误: " << e.what() << std::endl;
}
return 0;
}
该示例中,checkAge
函数在年龄不合法时抛出std::invalid_argument
异常,主函数通过try-catch
块捕获并处理错误信息。