ios @try catch

正常写一段代码

//比如通过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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2019年更新: 简单说就是这样: 原文如下: 最近看一些第三方的代码有@try,一副看不懂的样子,真心没用过,于...
    超_iOS阅读 35,952评论 3 70
  • 只写知识点,不写废话,简单直接明了 一、这东西在iOS中不常用 简单的来说,Apple虽然同时提供了错误处理(NS...
    _YZG_阅读 1,532评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • iOS程序异常crash捕获与拦截 对于iOS应用try-catch并不能捕获所有异常,也就是说有时候我们加上了t...
    OliviaZqy阅读 5,900评论 5 5
  • 初识异常(Exception) 比如我们在取数组里面的某个值得时候,经常会出现定义的取值范围超过了数组的大小,那么...
    iDaniel阅读 1,881评论 1 2