"自动引用计数"在默认情况下不是异常安全的,具体说,如果抛出异常,本应该在作用于末尾释放的对象就不会释放了。
id someResource = @"";
if (someResource/* check for error */) {
@throw [NSException exceptionWithName:@"ExceptionName" reason:@"There was an error" userInfo:nil];
}
[someResource domain];
[someResource release];
在抛出异常前先释放someResource,可以解决问题。如果待释放的资源有很多,释放资源的代码就容易写的很乱。
OC所采用的办法是,只在极其罕见的情况下抛出异常,异常抛出之后,无需考虑修复问题,应用程序此时应该直接退出。不在编写复杂的“异常安全代码了”。
异常只用于处理严重错误。如果出现“不那么严重的错误”,OC令方法返回 0或者nil或者error,表示有错误发生。例如:初始化方法无法根据传入的参数来初始化当前实例,就令其返回nil或者0。
NSError的用法更加灵活,我们可以把导致错误的原因报给调用者。
Error domain(错误范围,其类型为字符串)
--错误发生的范围。也就是产生错误的根源,通常用一个特有的全局变量来定义。例如:“处理URL的子系统”在从URL解析中获得数据时如果出错了,那么就会使用NSURLErrorDomain来表示错误范围。
Error code(错误码,类型为整数)
--独有的错误代码,用来指明具体发生了什么事故。某个特定范围内可能发生一系列相关的错误,通常用枚举定义这些错误。
User info(用户信息,类型为字典)
--错误的额外信息
总结:
1.只有发生了导致整个程序崩溃的错误时,才使用异常
2.在错误不是很严重的情况下可以使用“委托方法”来处理错误,也可以把错误信息放在NSError对象中,经由“输入输出”返回给调用者。