文章出處

 

一直聽說iOS有異常處理機制,卻從來沒有關系過,今天小生就來關心下iOS的異常處理機制吧。

 
以下文字是從Object-C2.0(蘋果官方文檔)中翻譯的,特此注明。
 
異常處理
Object-C提供了對于異常處理和線程同步的支持,啊哈,也就是這一章和線程(關于線程同步,大家可以看這里,http://blog.sina.com.cn/s/blog_69081e060100uomh.html)那一章要講的內容。在GNU編譯器(GCC)3.3或以上版本上使用-fobjc-exceptions指令,可以支持以上特性。
注意:要在一個應用里同時使用這些特性,應用必須在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塊總會執行的哦親。

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()