簡體   English   中英

將Java轉換為Objective-C:異常處理

[英]Converting Java to Objective-C: Exception Handling

我正在將Java庫轉換為Objective-C。 Java代碼公然使用異常(在我的Objective-C習慣上)。 轉換時,我應該拋出Objective-C異常(僅在庫中;我會在它們離開之前捕獲它們)還是應該使用NSError構造。

我熟悉常規Objective-C代碼中的異常用例; 即僅針對真正的異常錯誤。 如果這里沒有明確的答案,則可能會使用NSErrors。

如果庫可以獨自處理所有異常,那么從Objective-C的意義上來說,它們並不是真正的異常:沒有發生程序員錯誤;它沒有發生。 相反,發生了完全預期的事情。 您應該根據需要使用使用錯誤代碼/ NSError ,但是您可以處理掉異常提供的許多信息,而只返回一個表示“錯誤”的值( nil ,0和NSNotFound是一些常見的)並處理。 您可能還會考慮錯誤處理委托方法。

在Objective-C投擲和捕獲異常是昂貴的(除了在32位的Mac OS X,其中@try異常醒目代碼的一部分是昂貴的部分,而不是@catch一部分)。

最好不要以某種機制返回錯誤代碼(例如NSError ,這是在Objective-C中使用的OO方法。)讓它們冒泡到訪問您框架的代碼,然后讓代碼適當地對其進行處理。

在任何一個系統發生錯誤的情況下,內存清理都不必擔心,因為您應該能夠將大多數對象和分配放入自動釋放池中。 但是,請注意,該池將吞噬在其范圍內創建的所有NSErrorNSException對象,因此您必須確保這些對象能夠在代碼末尾繼續生存,並具有額外的保留和釋放。 (稍微偏離主題,但是我已經看到很多人在執行錯誤處理時把這部分搞砸了。)

我只會在Objective-C庫上返回錯誤(NSError方法)。 畢竟,這是在C中完成錯誤處理的方式。

我不會擔心使用或不使用異常。 如果它使您的代碼更整潔,請使用它們。 您真正需要注意的唯一事情就是不要通過您不知道的異常安全代碼拋出異常,這幾乎是您未編寫的所有代碼。

是的,使用異常的代價很高,但是擔心這是過早優化的一個例子。 畢竟,與C函數調用相比,Objective-C消息的分發是昂貴的,但是您不會聽到Objective-C程序員說“不要使用Objective-C消息”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM