正常写一段代码
//比如通过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