Objective-C中使用@try處理異常

轉載自:http://www.itivy.com/iphone/archive/2011/12/20/iphone-objective-c-try-catch-statement.html

Objective-C中使用@try處理異常

這一篇我們主要來講講Objective-C中的@try塊來處理異常,與@try結合一起的有@catch、@finally。文章非?;A,希望對初學者有所幫助。

在我們編寫Objective-C程序時,最好的編程實踐是指能預測程序中可能出現的問題。為此,你可以測試使程序異常終止的條件并處理這些情況,可能要

記錄一條消息并完全終止程序,或者采取其他正確措施。以避免錯誤為例,在程序運行時執行測試可以避免向對象發送未識別的消息。當試圖發送這類未識別消息

時,程序通常會立即終止并拋出一個異常。

看看下面的代碼,Fraction類中未定義任何名為noSuchMethod的方法。當你編譯程序時,就會得到相關警告消息。

#import “Fraction.h”

intmain (intargc,char*argv [])

{

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

Fraction*f = [[Fraction alloc] init];

[fnoSuchMethod];

NSLog(@”Execution continues!”);

[f release];

[pool drain];

return0;

}

你可以不管警告消息繼續運行程序。如果這樣做,程序可能會異常終止,并出現類似如下的錯誤:

-[Fraction? noSuchMethod]: unrecognized selector sent to instance 0x103280

***

Terminating app due to uncaught exception ‘NSInvalidArgumentException’,

reason:

‘*** -[Fraction noSuchMethod]: unrecognized selector sent

to instance 0x103280’

Stack:

(

2482717003,

2498756859,

2482746186,

2482739532,

2482739730

)

Trace/BPT trap

為了避免在這類情況下程序異常終止,可以在一個特殊的語句塊中加入一條或多條語句,格式如下:@try{

statement

statement

...

}

@catch(NSException *exception) {

statement

statement

...

}

在@try塊中加入這些statement后,程序正常執行。但是,如果塊中的某一條語句拋出異常,執行不會終止,而是立即跳到@catch塊,在那里繼續執行。在@catch塊內可以處理異常。這里可行的執行順序是記錄出錯消息、清除和終止執行。

下面的代碼演示了異常處理,緊跟著的是程序的輸出。

#import “Fraction.h”

intmain (intargc,char*argv [])

{

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

Fraction*f = [[Fraction alloc] init];

@try{

[f noSuchMethod];

}

@catch(NSException *exception) {

NSLog(@”Caught%@%@”, [exception name], [exception reason]);

}

NSLog(@”Execution continues!”);

[f release];

[pool drain];

return0;

}

輸出結果:

-[Fraction noSuchMethod]: unrecognized selector sent to instance 0x103280

Caught

NSInvalidArgumentException: *** -[Fraction noSuchMethod]:

unrecognized

selector sent to instance 0x103280

Execution

continues!

出現異常時,@catch塊被執行。包含異常信息的NSException對象作為參數傳遞給這個塊。如你所見,name方法檢索異常的名稱,reason方法給出原因(運行時系統還會將原因自動輸出〕。

這是一個非常簡單的例子,演示了如何在程序中捕獲異常??梢允褂聾finally塊包含是否執行拋出異常的@try塊中的語句代碼。

@throw指令允許你拋出自己的異常??梢允褂迷撝噶顠伋鎏囟ǖ漠惓#蛘咴贎catch塊內拋出帶你進入類似如下代碼塊的異常:

@throw;

自行處理異常后(例如,可能是在執行清除工作后)可能需要這么做。然后便可以讓系統處理其余的工作。最后,可以使用多個@catch塊按順序捕獲并處理各種異常。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 通俗編程——白話JAVA異常機制 - 代碼之道,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語閱讀 3,202評論 0 25
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 初識異常(Exception) 比如我們在取數組里面的某個值得時候,經常會出現定義的取值范圍超過了數組的大小,那么...
    iDaniel閱讀 1,884評論 1 2
  • 你,若即若離 明明很近,面對面 在拐角遇見的那一刻 我們視線都沒有交集 擦肩而過 我們的靈魂都禮貌又體面地道歉 “...
    你好_久年閱讀 224評論 10 2
  • 剛開始看這本書的時候,還以為是千篇一律的內容,看到后來發現其實內容還是很不錯的,算是比較充實的內容吧,里面有一些看...
    Erin棋落閱讀 379評論 0 1