學習筆記 比較基礎
基本概念
@try
@catch
是Objective-C
異常捕捉機制
* `@try`存放可能出現(xiàn)異常的代碼 - 發(fā)現(xiàn)異常
* `@catch`異常處理邏輯 - 捕捉異常 && 處理異常
* `@finally`回收資源 -- 執(zhí)行收尾
在我們編寫Objective-C程序時轩性,最好的編程實踐是指能預測程序中可能出現(xiàn)的問題良蒸。為此毡庆,你可以測試使程序異常終止的條件并處理這些情況洪添,可能要記錄一條消息并完全終止程序腊瑟,或者采取其他正確措施跳昼。以避免錯誤為例对嚼,在程序運行時執(zhí)行測試可以避免向?qū)ο蟀l(fā)送未識別的消息。當試圖發(fā)送這類未識別消息時杰标,程序通常會立即終止并拋出一個異常兵怯。
___Objective-C中使用@try處理異常
測試總結
void(^_asect)(NSString *str) = ^(NSString *str){
NSCAssert(NO, str);
};
static inline void catchexception(NSString *str){
NSCAssert(NO, str);
}
NSArray *arr = nil;
@try {
NSDictionary *dic = @{arr:arr};
NSLog( @"%@", dic);
}@catch (NSString *exception) {
NSLog(@"@exception11111");
NSLog( @"異常:%@", exception);
}@catch(NSException *exception){
NSLog(@"@exception22222");
catchexception(exception.reason);
}@catch(NSException *exception){
NSLog(@"@exception33333");
_asect(exception.reason);
}@finally {
NSLog(@"@finally");
}
NSLog(@"@finally44444");
-
@try產(chǎn)生異常時
會在之后的@catch中捕捉異常,如果異常類型和@catch的參數(shù)類型相符,就會執(zhí)行@catch中的代碼;如果異常類型和@catch的參數(shù)類型不相符,就會執(zhí)行后面的@catch知道異常類型匹配/如果類型都不匹配,所有@catch中的代碼都不會執(zhí)行;最后執(zhí)行@finally
如果在執(zhí)行@catch和異常類型匹配,就會執(zhí)行@catch中的代碼;如果@catch中代碼也存在異常,異常之后的代碼不再執(zhí)行;最后執(zhí)行@finally
多個@catch存在時 ,異常只會在首個&&異常匹配的@catch 中執(zhí)行, 之后的@catch不再執(zhí)行;最后執(zhí)行@finally
@try不產(chǎn)生異常時
只會執(zhí)行@try中的代碼和@finally中的代碼
@finally代碼塊一定執(zhí)行
如果@finally執(zhí)行代碼中出現(xiàn)異常, 異常之后的代碼不再執(zhí)行
@finally之外的代碼
在異常正常捕捉并且@catch和之后執(zhí)行的@finally中的執(zhí)行代碼不存在異常的情況下會執(zhí)行
@catch 和 @finally代碼塊執(zhí)行時出現(xiàn)的異常
這些異常會被返回給方法的調(diào)用者
補充_NSException
NSException 是 OC 中所有異常的父類
主要屬性
@property (readonly, copy) NSExceptionName name;
@property (nullable, readonly, copy) NSString *reason;
@property (nullable, readonly, copy) NSDictionary *userInfo;
- @catch 代碼塊捕獲異常時查看 異常對象類型是否是 捕獲的異常類型 或者其子類, 一旦放在開頭, 后面的異常永遠不可能捕獲;
eg:
NSArray *arr = nil;
@try {
NSDictionary *dic = @{arr:arr};
NSLog( @"%@", dic);
} @catch (NSException *exception) {//執(zhí)行
NSLog( @"異常:%@", exception.name);
}@catch(NSException *exception){//不執(zhí)行
catchexception(exception.reason);
}@catch(NSException *exception){//不執(zhí)行
_asect(exception.reason);
}@finally {
NSLog(@"@finally");
}