您的位置:首页 > 移动开发 > IOS开发

iOS OC 异常处理

2015-07-09 00:00 239 查看
摘要: 异常处理

一 简述

自动引用计数 ARC 默认情况下不是"异常安全的",具体来说,如果抛出异常,那么本应在作用域末尾释放的对象现在却不能自动释放,如果想生成"异常安全"的代码,可以通过设置编译器的标志实现,不过这将引入一些 额外的代码,在不抛出异常时,也照样要执行这部分代码,需要打开的编辑器标志叫做-fobjc-arc-excepitons.

OC 语言现在采用的办法是,只有在严重的情况下抛出异常,异常抛出之后,无需考虑恢复问题,而且运用程序此时应该退出,这就是说,不用编写复杂的"异常安全"代码了

异常用于处理严重的错误,非致命的错误,OC采用的编程范式为:令方法返回nil/0,或是使用NSError,表明其中有错误发送。

例如:初始化方法无法根据传入的参数来初始化当前实例,那么就可用令其返回nil/0:

-(id)initWithValue:(id)value
{
if((self = [super init])){
if( /*Value means instance can’t be created */ ){
self = nil;
}else{
//initialize instance
}
}
return self;
}


二 NSError 使用

NSError 用法更灵活,经由此对象昂,可以把导致错误的原因回报给调用者。

Error domain(错误范围,类型为字符串)

错误发生的范围,也就是产生错误的原因,通过用一个特有的全局变量来定义,比方说,“处理URL的子系统”(URL-handling subsystem)在从URL中解析或取得数据时如果出错了,就会使用NSURLErrorDomain来表示错误范围

Error code (错误码,其类型为整数)

独有的错误代码,用于指明在某个范围内具体发生了何种错误,某个特定范围内可能会发生一系列相关错误,这些错误情况通常采用 enum来定义,例如,当HTTP请求出错时,可能会把HTTP状态码设为错误码

User info (用户信息,其类型为字典)

有关此错误的额外信息,其中或许包含一段“本地化的描述”或许海包含有导致该错误发生的另外一个错误,经由此种信息,可将相关错误串成一条错误连(chain of errors)

2.1 NSError通过委托对象传递错误

在设计API 时,NSError 经常通过委托协议来传递错误,当错误发生时,当前对象会把错误信息经由协议中的某个方法传给其委托对象。例如,NSURLConnection 在其委托协议NSURLConnectionDelegate 之中就定义了如下方法:

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

当NSURLConnection 出现错误时,就调用该方法处理。改方法不一定要实现,由程序员自己判断

2.2 NSError 作为方法输出参数

NSError 的另一常见用法是:作为方法的"输出参数"返回给调用者。

-(BOOL)doSomething:(NSError *)error


传递给方法的参数是个指针,而该指针本身有指向NSError 对象,可以把 输出参数 NSError 对象回传给调用者。

NSError *error = nil;
BOOL ret = [object doSomething:&error];
if(error){
//there was an error
}


三 总结

只有发生了可是整个运用程序崩溃的严重错误时,才应使用异常

在错误不那么严重的情况下,可用指派“委托方法”来处理错误,也可用把错误信息放在NSError 对象里,竟有“输出参数”返回给调用者
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IOS OS NSError