第一节 · 匹配想法 · 正则表达式

程序运行时总会遇到各种意外情况。异常处理提供了一种结构化的方式来处理运行时错误。


基本异常处理

#include <stdexcept>

double divide(double a, double b)
{
    if (b == 0)
    {
        throw runtime_error("Division by zero!");
    }
    return a / b;
}

int main()
{
    try
    {
        cout << divide(10, 2) << endl;  // 5
        cout << divide(10, 0) << endl;  // 抛出异常
    }
    catch (const runtime_error& e)
    {
        cerr << "Error: " << e.what() << endl;
    }
    
    cout << "Program continues..." << endl;
    return 0;
}

异常类层次


多重 catch


自定义异常


noexcept 声明

为什么重要?

  • 移动构造/赋值应该是 noexcept

  • 允许编译器优化

  • STL 容器会利用 noexcept 信息


异常安全性


RAII 与异常


重新抛出异常


异常与构造函数


function-try-block


习题

  • 实现一个带有详细错误信息的自定义异常类。

  • 解释强异常安全保证与基本异常安全保证的区别。

  • 为什么析构函数不应该抛出异常?

Last updated