正常寫一段代碼
//比如通過KVO獲取??框的清除按鈕
UIButton *clearButton = [self.view valueForKey:@"_clearButton"];
if(clearButton){
//xxx
}
如果此時self.view 沒有“ _clearButton” 就會造成崩潰:
此時可以在可能發(fā)生異常的地方使用 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");
此時上邊引起崩潰的異常會被捕獲而不是直接崩潰,
代碼可能的執(zhí)行順序:
1:try語句塊沒有拋出異常。如果是這種情況,程序會執(zhí)行try,finally以及finally塊之后的代碼;
2:try語句塊拋出了異常并且catch有匹配的異常。當遇到try里面拋出的異常后,try塊里面剩下的代碼就不執(zhí)行了,跳轉到catch塊里面。
這里又可以分為2種情況。第一種,拋出的異常被后面的catch捕獲,而catch又沒有拋出新的異常,那么執(zhí)行順序是1356 ;第二種,如果catch里面又拋出新的異常,順序是1345,然后將新的異常返回給方法調用者,6就不執(zhí)行了 ;
3:try語句塊拋出了異常,但是后面的catch沒有能匹配的異常。那么會執(zhí)行try和finally里面的語句也就是15,然后將該異常返回給方法調用者,不執(zhí)行6 。
總結:
如果異常不能被捕捉的話,finally{}后面的語句就不會執(zhí)行了,而finally{}一定被執(zhí)行
參考:_超
的 iOS @try @catch異常機制 http://www.itdecent.cn/p/f28b9b3f8e44