编写高质量OC代码52建议总结:21.理解Objective-C的错误模型
2017-02-21 11:04
405 查看
"自动引用计数"在默认情况下不是异常安全的,具体说,如果抛出异常,本应该在作用于末尾释放的对象就不会释放了。
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对象中,经由“输入输出”返回给调用者。
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对象中,经由“输入输出”返回给调用者。
相关文章推荐
- 编写高质量OC代码52建议总结:11.理解objc_msgSend的作用(消息机制)
- 编写高质量OC代码52建议总结:22.理解NSCopying协议
- 写高质量OC代码52建议总结:29.理解引用计数
- 编写高质量OC代码52建议总结:23.通过委托与数据源协议进行对象间通信
- 编写高质量OC代码52建议总结:13.用“方法调配技术”调试“黑盒方法”
- 编写高质量OC代码52建议总结:24.将类的实现代码分散到便于管理的数个分类中
- 编写高质量OC代码52建议总结:18.尽量使用不可变对象
- 编写高质量OC代码52建议总结:25.总是为第三方类的分类名称加前缀
- 编写高质量OC代码52建议总结:16.提供“全能初始化方法”
- 编写高质量OC代码52建议总结:10.关联对象
- 编写高质量OC代码52建议总结:26.不要在分类中设置属性
- 编写高质量OC代码52建议总结:9.以“族类模式“隐藏实现细节
- 编写高质量OC代码52建议总结:20.为私有方法加前缀
- 写高质量OC代码52建议总结:32.编写“异常安全代码”时留意内存管理问题
- 编写高质量OC代码52建议总结:17.实现describtion方法
- 编写高质量OC代码52建议总结:27.使用“class-continuation 分类” 隐藏实现细节
- 编写高质量OC代码52建议总结:19.使用清晰而协调的命名方式
- 写高质量OC代码52建议总结:47.熟悉系统架构
- 写高质量OC代码52建议总结:30.以ARC简化引用计数
- 写高质量OC代码52建议总结:33.以弱引用避免保留环