第21条:理解Objective-C错误模型
异常安全
ARC在默认情况下并不是“异常安全的”(exception safe),要想生成“异常安全”的代码可以通过设置编译器的标志(-fobjc-arc-exceptions)来实现。
但是,现在Objective-C语言只有在极其罕见的情况抛出异常,抛出异常之后,无须考虑恢复问题,而且应用程序此时也应该退出。这就是说,不用再编写复杂的“异常安全”代码了。
针对各种错误的处理方式
- 严重错误:抛出异常,例如,编写了某个抽象基类,如果有人直接使用这个抽象基类,那么就抛出异常。
- 其他错误:令方法返回nil/0,或是使用NSError,以表明其中有错误发生。例如,如果初始化方法无法根据传入的参数来初始化当前实例,那么就可以令其返回nil/0。
NSError对象
经NSError对象,可以把导致错误的原因回报给调用者。
NSError对象里会封装3条信息:
- Error domain:错误范围,其类型为字符串。通常用一个特有的全局常量来定义。
- Error code:错误码,其类型为整数。通常定义为枚举类型。
- User info:用户信息,其类型为字典。
*** NSError的常见用法 ***
- 通过委托协议来传递此错误。有错误发生时,当前对象会把错误信息经由协议中的某个方法传给其委托对象(delegate)。
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- 经由方法的“输出参数”返回给调用者。
传递给方法的参数是个指针,而该指针本身又指向另外一个指针,那个指针指向NSError对象。或者也可以把它当成一个直接指向NSError对象的指针。- (BOOL)doSomething:(NSError**)error
要点
- 只有发生了可使整个应用程序崩溃的严重错误时,才应使用异常。
- 在错误不那么严重的情况下,可以指派“委托方法”(delegate method)来处理错误,也可以把错误信息放在NSError对象里,经由“输出参数”返回给调用者。