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 的修改影响了原来的
异常对象 这些修改是被重新抛出的异常对象的一部分。