C++ primer 11 异常


enum EHstate { noErr, zeroOp, negativeOp, severeError };
enum EHstate state = noErr;

int mathFunc( int i ) {
if ( i == 0 ) {
state = zeroOp;
throw state; // 创建异常对象
}

// 否则, 正常处理流程继续
}



void calculate( int op ) {
try {
mathFunc( op );
}
catch ( EHstate &eObj ) {
// 修正异常情况
eObj = noErr; // 全局变量 state 没有被修改
}
}


[size=large][b] 重新抛出 [/b][/size]
在某些修正动作之后 catch 子句可能决定该异常必须由函数调用链中更上级的函数来处理 那么catch子句可以通过重新抛出.
rethrow 该异常把异常传递给函数调用链中更上级的另一个catch 子句.
rethrow 表达式的形式为
throw;
rethrow 表达式重新抛出该异常对象 rethrow 只能出现在catch 子句的复合语句中 异常对象总是在抛出点被创建 ,不管catch是否为传引用,throw指定的值是不会被改变的,改变的事异常对象的值。


enum EHstate { noErr, zeroOp, negativeOp, severeError };

void calculate( int op ) {
try {
// 被 mathFunc() 抛出的异常的值为 zeroOp
mathFunc( op );
}
catch ( EHstate eObj ) {
// 做某些修正
// 试图修改异常对象
eObj = severeErr;

// 希望重新抛出值为 severeErr 的异常对象 其实没有改变
throw;
}
}


因为eObj 不是引用 所以catch 子句接收到的是异常对象的拷贝 在处理代码中对eObj
所做的任何修改都只是改变了局部拷贝 它们不影响由throw 表达式创建的原来的异常对象
因为在我们的例子中catch 子句里没有修改原来的异常 所以被重新抛出的对象仍然具有初
始的zeroOp 值


cacth ( EHstate &eObj ) {
// 修改异常对象
eObj = severeErr;

// 被重新抛出的异常的值是 severeErr
throw;
}


eObj 指向由throw 表达式创建的异常对象 在catch 子句中对eObj 的修改影响了原来的
异常对象 这些修改是被重新抛出的异常对象的一部分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值