2012-02-23 88 views
2

所有在Xcode停止採伐誤差,如何使@try @catch

我有一段代碼運行在大量的記錄,並在大約一半的情況下,失敗(這是確定的,一些記錄簡單地沒有所需的數據)我把這段代碼放在一個@try @catch塊中,使它運行順利,我們試圖做我們的事情,如果我們失敗了,我們有一些默認的行爲。

當它在@try塊中失敗時,它經常是無法識別的選擇器錯誤,因爲它位於@try塊中,我發現這個錯誤,但它仍然每次都被記錄下來,即使我沒有從我的@ catch塊。這非常煩人,因爲它堵塞了我的日誌記錄。如果我想從@ try/@ catch中記錄錯誤,我會在@catch右邊處理這個問題嗎?

我怎麼能阻止在@try塊錯誤記錄那些在@catch塊隨後解決的XCode?

我使用的XCode 4.2

感謝

+0

在Objective-C中,您通常應避免使用異常(@ try/@ catch [/ @ finally])進行流量控制。例外情況的成本非常高(與運行時間相比,如JVM或針對異常使用進行了優化的CLR)。而且,大多數Cocoa框架並不是特例安全的。因此,通過Cocoa框架代碼拋出異常是很危險的,並且可能會導致您的應用程序出現奇怪,難以診斷和災難性的情況(考慮可能的數據丟失)。 – 2012-02-23 09:28:58

+0

代替使用異常,Cocoa代碼使用NSError來指示應用程序內可恢復的錯誤條件。異常用於表示應用程序無法恢復的條件。 – 2012-02-23 09:29:03

回答

1

在Objective-C使用例外可以出現在一個程序中的任何正常的情況是一個沒有去。異常僅用於發現和捕獲編程錯誤並正常終止。問題在於,所有標準庫(Cocoa,CoreFoundation,C標準庫,...)都不是爲了處理異常而構建的,並且如果異常通過它們,將無法清理資源。

從理論上講,如果你確信你正確地做你的記憶力和其他清理,不通過對外代碼扔你可以使用異常。如果你使用ARC,那麼有一個編譯器開關-fobjc-arc-exceptions可以幫助你正確地獲得內存管理(在你的代碼中)。

常見的做法是不使用在所有異常(比其他錯誤,例如使用NSAssert)。

+0

我知道這不是最好的方法,但它不是我的問題/解決方案的答案。 – ophychius 2012-02-23 10:02:11

+0

我寫了這個答案,以明確唯一干淨的解決方案是改變你的架構。你必須防止發生錯誤。 Objective-C可以在很多方面幫助你,但你必須採用Cocoa的編碼模式。 – 2012-02-23 10:32:36

+0

你是對的,我會去改變我的代碼到一個更合適的架構。 – ophychius 2012-02-24 10:25:09

0

異常本身不會將任何消息記錄到控制檯。 Xcode(默認情況下)都不記錄任何異常拋出。

就這麼拋出異常之前寫入的消息的錯誤捕獲代碼。 NSObject的doesNotRecognizeSelector:將在發送無法識別的選擇器時打印消息。您無法關閉此功能。

+0

這個答案確實增加了一些清晰度 – ophychius 2012-02-24 10:25:31

0

所以你想看到某些日誌消息,但不是其他人。如何重定向調試器輸出into a file。在該文件上使用grep或具有良好過濾功能的文本編輯器來掃描您想查看的消息。從gdb控制檯複製粘貼到edtor將執行相同的技巧。