4抛出异常
2019-07-29 本文已影响0人
蜗牛你慢慢来
一旦程序检测到异常,它必须将异常传播到处理它的代码。此代码称为异常处理程序。传播异常的整个过程称为 “抛出异常”(或“引发异常”)。通过实例化 NSException 对象,然后对其执行以下两项操作之一,可以抛出(或引发)异常:
- 将其用作@throw 编译器指令的参数
- 给它发一条引发消息。
下面的示例显示如何使用@throw 指令引发异常(引发选项 被注释掉):
NSException* myException = [NSException
exceptionWithName:@"FileNotFoundException"
reason:@"File Not Found on System"
userInfo:nil];
@throw myException;
// [myException raise]; /* equivalent to above directive */
@throw 和 raise 的一个重要区别是后者只能发送到 NSException 对象,而@throw 可以将其他类型的对象作为其参数(如字符串对象)。Cocoa 应用程序应该只能抛出NSException 对象。
通常在异常处理域内抛出或引发异常,该域是由@try 汇编指令标记的代码块。
有关详细信息,请参阅《处理异常》。
在异常处理域中,你可以通过向 NSException 对象发送另 一个引发消息或将其与另一个@throw 指令一起使用,将本地异常处理程序捕获的异常重新传播到更高级别的处理程序。请注意,在@catch 异常处理块中,可以在不显示指定异常对象的情况下重新引发异常,如下例所示:
@try {
NSException *e = [NSException
exceptionWithName:@"FileNotFoundException"
reason:@"File Not Found on System"
userInfo:nil];
@throw e;
}
@catch(NSException *e) {
@throw; // rethrows e implicitly
}
行为中有一个微妙的方面涉及到重新抛出的异常。在@throw 导致调用下一个更高的异常处理程序之前,将执行与本地@catch 异常处理程序关联@finally 块。在某种意义上,@finally 块是作为@throw 语句的早起副作用执行的。此行为对内存管理有影响(请参阅《异常处理和内存管理》)。