ios @try catch

作者: sunflower1518 | 来源:发表于2017-11-21 10:32 被阅读42次

    正常写一段代码

    //比如通过KVO获取🔍框的清除按钮
    UIButton *clearButton = [self.view valueForKey:@"_clearButton"];
    if(clearButton){
        //xxx
    }
    

    如果此时self.view 没有“ _clearButton” 就会造成崩溃:

    此时可以在可能发生异常的地方使用 try catch

    UIButton *clearButton = nil;
    @try {
        NSLog(@"1:异常代码");
        clearButton = [self.view valueForKey:@"_clearButton"];
        if(clearButton){
            //xxxxx
        }
        NSLog(@"2:异常后的代码");
    }
    @catch (NSException *exception) {
        
        NSLog(@"3:捕获到异常处理代码");
        NSLog(@"4:此处又产生新异常代码");
    }
    @finally {
        NSLog(@"5");
    }
        NSLog(@"6");
    

    此时上边引起崩溃的异常会被捕获而不是直接崩溃,
    代码可能的执行顺序:
    1:try语句块没有抛出异常。如果是这种情况,程序会执行try,finally以及finally块之后的代码;
    2:try语句块抛出了异常并且catch有匹配的异常。当遇到try里面抛出的异常后,try块里面剩下的代码就不执行了,跳转到catch块里面。

    这里又可以分为2种情况。第一种,抛出的异常被后面的catch捕获,而catch又没有抛出新的异常,那么执行顺序是1356 ;第二种,如果catch里面又抛出新的异常,顺序是1345,然后将新的异常返回给方法调用者,6就不执行了 ;

    3:try语句块抛出了异常,但是后面的catch没有能匹配的异常。那么会执行try和finally里面的语句也就是15,然后将该异常返回给方法调用者,不执行6 。
    总结:
    如果异常不能被捕捉的话,finally{}后面的语句就不会执行了,而finally{}一定被执行

    参考:_超
    的 iOS @try @catch异常机制 http://www.jianshu.com/p/f28b9b3f8e44

    相关文章

      网友评论

        本文标题:ios @try catch

        本文链接:https://www.haomeiwen.com/subject/ecpivxtx.html