2012-10-02 155 views
8

異常使用的利弊我讀了蘋果對exception使用和NSError使用建議:優點和iOS中/的ObjectiveC

另外,我看了幾個類似的堆棧溢出的問題,其討論是否使用或不例外。

Exception Handeling in iOS

Using exceptions in Objective-C

Objective-C Exceptions

我試圖找出使用異常的優劣作爲錯誤通知/ iOS中(坦白地說,我也不滿足於蘋果的判決處理方法(它說要做什麼,但它並沒有說明爲什麼我們應該這樣做):

您應該保留使用的編程異常或 意外運行時錯誤(如超出範圍集合訪問), 嘗試變更不可變對象,發送無效消息,並且 失去與窗口服務器的連接。當您創建應用程序時,而不是在運行時創建應用程序時,您通常會處理 這些類型的錯誤和異常。

異常使用情況的優點:

  • 它不需要修改錯誤產生代碼和錯誤處理碼之間的所有中間碼

  • 它不污染參數和返回值方法

缺點:

  • 對於所有手動管理的內存代碼,我們必須格外小心(我們需要將它封裝在自動釋放對象中以確保釋放資源)。

  • 我們需要小心我們的代碼和框架之間的邊界。如果我們的例外留下我們的代碼,我們可能會陷入困境(因爲框架可能會手動管理內存)

我錯過了什麼嗎?有額外的利弊嗎?

它看起來像異常應該罰款庫類似的代碼(當我們有相當大量的緊密打包的代碼,這與外部系統/框架沒有太多的溝通,而且看起來像是很難用於。其積極與其他框架交互的代碼

請問您的經驗證明這個理論

我明白在這個問題上的任何其他信息

+1

我不真的看到缺點。無論如何,你想做這兩件事,不是嗎? – Sulthan

+0

我會說,首先不是一個騙局。無論如何,你必須這樣做。其次可能是一種痛苦的(正如我所理解的ObjectiveC(Java)並沒有提供讓開發人員知道某些方法可以拋出的好方法,因此,只需在邊界代碼中添加一個方法並忘記它就很容易來捕獲這個代碼可能拋出的異常 –

+0

但是,問題在於代碼和系統代碼之間的邊界通常非常複雜,如果使用Foundation集合類,那麼每次使用這些集合都是邊框,例如 – bbum

回答

13

TL;博士例外應該用於致命/不可恢復/程序員錯誤(s)只。嘗試使用它們Java或其他可恢復的異常環境會導致代碼更脆弱,更難維護,難以重構,同時也限制了您利用系統框架的能力。


缺點:如果您使用的流量控制和/或在你的代碼將可恢復錯誤異常,你的代碼將是,通過設計,從蘋果的設計模式不同。

最終結果?

•您不能在代碼中使用蘋果的API 在所有除非你的代碼和蘋果的總是之間的邊界隔離異常行爲

•您的每一次重構,你就必須重構大量的異常處理代碼

•許多應該微不足道的事情會非常複雜;例如,你將無法將你的對象放入一個枚舉集合中,並枚舉它們而沒有枚舉 - 塊,for循環,無論如何...... - 在邊界處也有異常處理。

考慮:

NSArray *a = @[yourExceptionfulInstance, yourExceptionfulInstance, yourExceptionfulInstance]; 

@try { 
    for(id k in a) { [k doSomething]; } 
} @catch(...) { 
} 

如果doSomething可能會提高,以任何理由,上面是違反了框架的記載設計模式,因爲你在所有幀蘋果的框架內拋出異常( S)。

這是一個強大的騙子。足夠大,我無法想象一組專業人士勝過它。

+0

好點。謝謝。 –