C++中try块的用法
·
try 块的基本用法
在 C++ 中,try 块用于包裹可能抛出异常的代码。其基本语法如下:
try {
// 可能抛出异常的代码
} catch (exception_type& e) {
// 异常处理代码
}
try 块必须与至少一个 catch 块配合使用,否则会导致编译错误。
异常抛出与捕获
当 try 块内的代码抛出异常时,程序会立即跳转到匹配的 catch 块执行。异常类型通过 throw 关键字抛出:
try {
if (error_condition) {
throw std::runtime_error("Error message");
}
} catch (const std::runtime_error& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
catch 块可以捕获特定类型的异常(如 std::runtime_error),或使用 catch (...) 捕获所有异常(不推荐,因无法获取异常信息)。
标准异常类
C++ 标准库提供了一系列异常类(定义在 <stdexcept> 中),例如:
std::logic_error:逻辑错误(如无效参数)。std::runtime_error:运行时错误(如文件无法打开)。
用户也可自定义异常类,需继承自std::exception。
栈展开与资源管理
当异常抛出时,程序会从 try 块开始栈展开(stack unwinding),析构局部对象。为确保资源释放,应使用 RAII(Resource Acquisition Is Initialization)技术,例如智能指针:
try {
std::unique_ptr<int> ptr(new int(42));
throw std::exception();
} catch (...) {
// ptr 会自动释放内存
}
noexcept 与异常规范
C++11 引入 noexcept 关键字,标记函数不抛出异常:
void safe_function() noexcept {
// 保证不抛出异常
}
若标记为 noexcept 的函数抛出异常,程序会直接调用 std::terminate。
多 catch 块与异常链
可以定义多个 catch 块处理不同类型的异常,按顺序匹配:
try {
// 代码
} catch (const std::invalid_argument& e) {
// 处理无效参数
} catch (const std::exception& e) {
// 处理其他异常
}
C++17 支持异常链(嵌套 try-catch),但需手动实现异常传递逻辑。
性能与最佳实践
异常处理会引入额外开销,应避免用于常规控制流。建议:
- 仅在真正异常情况下使用
throw。 - 优先使用返回值或错误码处理可预期的错误。
- 确保异常安全(强异常安全保证)。
更多推荐



所有评论(0)