轉載自: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塊按順序捕獲并處理各種異常。