一直聽說iOS有異常處理機制,卻從來沒有關系過,今天小生就來關心下iOS的異常處理機制吧。
以下文字是從Object-C2.0(蘋果官方文檔)中翻譯的,特此注明。
異常處理
注意:要在一個應用里同時使用這些特性,應用必須在MAC OS X v10.3或者以上版本中。因為早期版本的運行環境不支持異常處理和線程同步。
處理異常
Object-C語言的異常處理符號和C++、JAVA相似。再加上使用NSException,NSError或者自定義的類,你可以在你的應用程序里添加強大的錯誤處理機制。
異常處理機制是由這個四個關鍵字支持的:@try,@catch,@thorw,@finally。當代碼有可能出現異常時,我們把他放到@try語句塊中。@catch()塊包含了處理@try塊里的拋出的異常的邏輯。無論異常是否發生,@finally塊里面的語句都會執行。如果直接使用@throw塊來拋出異常,這個異常本質上是一個OC的對象。咱們可以使用NSException對象,但是不局限于他們。
下面是一個典型的異常處理塊的例子:
Cup *cup = [[Cup alloc] init];
@try { [cup fill];
} @catch (NSException *exception) {
NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
} @finally {
[cup release];
}
拋出異常
為了擲出一個異常,我們必須實例化一個對象,當然這個對象要包含相關的信息,比如異常的名字和為什么要擲出他。
NSException *exception = [NSException exceptionWithName:@"HotTeaException" reason:@"The tea is too hot" userInfo:nil];
@throw exception;
(好吧 我承認國外的程序員挺有愛的。)
和@catch()塊相反,你可以使用@throw再次擲出一個被抓到的異常,不用加參數哦親。這個能使你的代碼更可讀。(我怎么沒看出來)
你也可以繼承NSEception,來實現特殊類型的異常,比如文件系統的異常或者交互異常。
注意:不用僅限于擲出NSException對象。你可以擲出任何一個OC對象作為一場對象。NSException類提供的方法可以幫助你處理異常,但是如果你愿意你可以實現你自己的。
高端處理異常(尼瑪這標題怎么翻啊,來去就是這幾個單詞,老外哥哥你敢不敢換幾個啊)
為了捕獲一個使用@try塊擲出的異常,你可以在@try后面使用多個@catch()塊,可以用多個哦親。@catch塊可以由最特殊的到最普遍的排序(我覺得翻譯成重要不重要的比普遍好多了,但是尊重GOOGLE,你們懂的)。這樣你就可以度身訂造你的異常處理過程。就像下面所示的那樣9-1(原諒我的不專業吧 兄弟們):
Listing 9-1An exception handler @try {
...
} @catch (CustomException *ce) { //1
...
} @catch (NSException *ne) { //2
// Perform processing necessary at this level. ...
// Rethrow the exception so that it's handled at a higher level. @throw;
} @catch (id ue) { //3
...
} @finally { //4
// Perform processing necessary whether an exception occurred or not. ...
}
下面的列表描述了數字所在行代碼的含義:
1、捕獲最重要的異常類型。
2、捕獲一個比較重要的異常類型。
3、再次擲出捕獲的異常。
為了劃分異常的處理過程,你可以在應用中做一個異常處理棧。這樣,如果一個方法或者函數捕獲了異常但是他不能處理,他可以再次擲給下一個異常處理機制。
4.善后工作總要做地嘛,不管有沒有異常,都要做善后處理。finally塊總會執行的哦親。