一、异常处理的背景

运行时错误 Run-Time Error

二、异常的发出与捕获

1. 发出异常 Raise an Exception

  1. 异常对象

  2. throw 语句

  3. noexpect 标签

  4. new 语句发出的异常

2. 捕获异常 Catch an Exception

  1. Try-Catch 块

    try {
        // code to exercise math options
        throw UnderFlowErr();  // 触发下溢错误
    
    } catch (ZeroDivideErr& e) {
        // 处理除零错误
        
    } catch (UnderFlowErr& e) {
        // 处理数值下溢错误
        
    } catch (MathErr& e) {
        // 处理其他数学相关错误(基类捕获)
        
    } catch (...) {
        // 捕获所有未被上述catch处理的异常(兜底处理)
    }
    
  2. 捕获顺序

    // 反例
    try {
        // code to exercise math options
        throw UnderFlowErr();  // 触发下溢错误
    
    } catch (MathErr& e) {
        // 处理除零错误
        
    } catch (UnderFlowErr& e) {
        // 处理数值下溢错误
        
    } catch (...) {
        // 捕获所有未被上述catch处理的异常(兜底处理)
    }
    
  3. 未被捕获的异常

  4. 异常处理器的参数类型

    // 异常处理器一般接收引用类型参数
    catch (Exception& e) {...}
    
    // 如果接收指针类型参数,则指针指向的动态空间何时被销毁不易确定,可能导致内存泄漏
    catch (Exception* p) {...}
    
    // 如果是值传递,则向上造型时会发生截断,导致类型信息和部分字段的丢失
    catch (Exception p) {...}
    
    

三、构造与析构过程的异常处理

1. 构造过程的异常处理

  1. 若构造函数内部抛出异常
  2. 二阶构造 Two Stages Construction