ios @try catch

正常寫一段代碼

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 2019年更新: 簡單說就是這樣: 原文如下: 最近看一些第三方的代碼有@try,一副看不懂的樣子,真心沒用過,于...
    超_iOS閱讀 36,321評論 3 70
  • 只寫知識點,不寫廢話,簡單直接明了 一、這東西在iOS中不常用 簡單的來說,Apple雖然同時提供了錯誤處理(NS...
    _YZG_閱讀 1,608評論 0 1
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • iOS程序異常crash捕獲與攔截 對于iOS應用try-catch并不能捕獲所有異常,也就是說有時候我們加上了t...
    OliviaZqy閱讀 6,004評論 5 5
  • 初識異常(Exception) 比如我們在取數組里面的某個值得時候,經常會出現(xiàn)定義的取值范圍超過了數組的大小,那么...
    iDaniel閱讀 1,966評論 1 2

友情鏈接更多精彩內容