2012-03-13 147 views
5

我得知目標C具有處理異常的等效方式,如C#.NET中一樣。 此外,正如蘋果文檔所說,我想處理/處理異常,創建一個NSError對象。 仔細看看「捕捉不同類型的例外」部分 在文檔中exception handlingiOS中異常處理的正確方法是什麼?

....我想捕捉不同類型的異常。在.NET中,我習慣瀏覽類方法的文檔以獲得可能引發的異常。 從apple-docs中獲取此信息的位置? 我怎麼知道,a-method/object/process-可以引發什麼樣的異常?

感謝您的建議

湯姆

回答

5

蘋果的文件說,最引發異常情況除外。 (有些例外都沒有,就像訪問一個對象的NSArray出界。)

.NET鼓勵本地異常處理。寫可可是爲了鼓勵大範圍的異常處理。在.NET中進行本地異常處理的原因是您希望某些部分以預期的方式失敗(如下載某些內容時出現網絡錯誤)。在Cocoa中,這是通過使用返回NSErrors的方法來處理的。這是同樣的事情,只在方法簽名中更明顯。

一個好的經驗法則是它不清楚你會怎麼連恢復可可只拋出的情況例外。 (不要把這個錯誤拋諸如地,因爲.NET 這樣的例外很難處理。)

+0

感謝您的輸入! – Tom 2012-03-13 15:02:15

2

看那developer reference for exception handling。在可可我們沒有得到像nilArgumentException的例外,我們只得到NSException。要給出細粒度的消息或處理,可以執行以下操作:

if ([[exception name] isEqualToString:MyAppException]) 

下面是NSException頭文件中定義的異常名稱列表。

FOUNDATION_EXPORT NSString * const NSGenericException; 
FOUNDATION_EXPORT NSString * const NSRangeException; 
FOUNDATION_EXPORT NSString * const NSInvalidArgumentException; 
FOUNDATION_EXPORT NSString * const NSInternalInconsistencyException; 

FOUNDATION_EXPORT NSString * const NSMallocException; 

FOUNDATION_EXPORT NSString * const NSObjectInaccessibleException; 
FOUNDATION_EXPORT NSString * const NSObjectNotAvailableException; 
FOUNDATION_EXPORT NSString * const NSDestinationInvalidException; 

FOUNDATION_EXPORT NSString * const NSPortTimeoutException; 
FOUNDATION_EXPORT NSString * const NSInvalidSendPortException; 
FOUNDATION_EXPORT NSString * const NSInvalidReceivePortException; 
FOUNDATION_EXPORT NSString * const NSPortSendException; 
FOUNDATION_EXPORT NSString * const NSPortReceiveException; 

FOUNDATION_EXPORT NSString * const NSOldStyleException; 

更正:

你也可以繼承NSException類,在下面的意見之一建議,捕捉自定義異常。

+1

沒有什麼可以阻止你繼承NSException並在自己的代碼中的'@ catch'塊捕捉特定類型。 – 2012-03-13 09:42:42

+0

感謝您的回答 – Tom 2012-03-13 15:03:13

+0

@GrahamLee。你說得很對。你一定可以延長。也開始關注你的博客:) – Vignesh 2012-03-14 06:27:19

5

Objective-C世界中的錯誤處理可能與您習慣的錯誤處理很不相同。簡而言之,忘記例外。大多數錯誤是由返回值或指針傳遞到NSError*處理:

NSErrror *error = nil; 
BOOL success = [somebody doSomethingWithError:&error]; 
if (!success) { 
    NSLog(@"Got error: %@", error); 
} 

而且在被叫方:

- (BOOL) doSomethingWithError: (NSError**) error 
{ 
    error = error ? error : &(NSError*){ nil }; 
    if (somethingWentWrong) { 
     *error = [NSError …]; 
     return NO; 
    } 
    // All is fine 
    return YES; 
} 

這看起來繁瑣,但在實踐中大多是工作正常。在個別情況下,一些真正能拋出一個異常(如[NSFileHandle writeData:]),文件中提到的事實,但我不認爲你預計將分析異常不亞於其他語言習慣。

+0

嗨祖爾,謝謝你的回答。只是爲了我自己的保證 - >這意味着一個好的做法是在我的項目中的所有代碼周圍構建一個try&catch塊形式 - (如果我忘記處理正確的事情 - 比如檢查null值)以防止軟件崩潰。否則我會繼續進行開發並且不再擔心異常處理? - 或者只是圍繞我的main方法建立一個try和catch-block,因爲無用的異常最終會在那裏結束(然後記錄它或向用戶顯示一條消息) – Tom 2012-03-13 14:58:58

+0

在Objective- C,向「無」對象發送消息是合法的。這有時是一個很好的節省時間,有時候還有一個不錯的bug等待發生。在Objective-C中,你大多會忘記try/catch塊。每當你調用可能失敗的東西時,請看看如何返回錯誤。在大多數情況下,你會得到一個'NSError',所以從方法簽名中就很明顯。在很少的剩餘情況下,文檔會告訴你方法可能會拋出,所以你需要一個try/catch塊。再次,這種情況很少見。 – zoul 2012-03-13 15:29:25

+0

感謝您的輸入,歡呼! – Tom 2012-03-14 16:19:08

相關問題