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
  • 优先使用返回值或错误码处理可预期的错误。
  • 确保异常安全(强异常安全保证)。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐