5嵌套异常处理
2019-07-30 本文已影响0人
蜗牛你慢慢来
异常处理程序可以嵌套,以便内部域中引发的异常可以由本地异常处理程序和任意数量的包含异常处理程序处理。这种设计允许由代码处理异常,尽管它与实际生成异常的代码相距较远,但可能对导致异常的条件有更多的了解。
带有编译器指令的嵌套异常处理程序
要了解如何调用用编译器指令定义的嵌套异常处理程序,请考虑清单1中的代码片段。
@try {
// ...
if (someError) {
NSException *theException = [NSException exceptionWithName:MyAppException reason:@"Some error just occurred!" userInfo:nil];
@throw theException;
}
}
@catch (NSException *exception) {
if ([[exception name] isEqualToString:MyAppException]) {
NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil, localException);
}
@throw; // rethrow the exception
}
@finally {
[self cleanUp];
}
代码段1 抛出和重新抛出一个异常
在这段代码中,异常会在本地处理程序的末尾再次抛出,从而允许包含异常处理程序采取一些额外的操作。图1说明了用@catch指令创建的嵌套异常处理程序之间的程序控制流。
使用指令的嵌套异常处理程序的控制流
在方法3的域中引发的异常导致执行跳转到其本地异常处理程序。在典型的应用程序中,这个异常处理程序查询异常对象以确定异常的性质。本地处理程序可以处理它识别的异常类型,然后可以重新引发异常对象,将异常通知传递给它上面嵌套的处理程序,即方法2中的处理程序。但是,在调用下一个外部异常处理程序之前,将执行与本地异常处理程序关联的@finally块中的代码。(这对内存管理有影响,如异常处理和内存管理中所讨论的那样。)
重新抛出的异常会出现在下一个更高的处理程序中,就像初始异常是在其自己的异常处理域中引发的一样。方法2的异常处理程序可能会再次处理异常,并可能将异常重新传递给方法1的异常处理程序;方法1的处理程序在方法2的@finally块完成其任务之前不会接收重新抛出的异常。最后,方法1的处理程序重新引发异常。因为方法1上面没有异常处理域,所以异常传递到未捕获的异常处理程序(请参见未捕获的异常)。