iOS OC 异常处理

一 简述

    自动引用计数 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 对象里,竟有“输出参数”返回给调用者 


转载于:https://my.oschina.net/wolx/blog/476764

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值