這種有強迫症的語言大概只有 Java 和最近誕生的 Swift 了,C++ 和 C# 有拋出例外的機制,但不強迫開發者宣告或捕捉,是否處理外全憑開發者的良心 (是的,寫作良心唸作時間,有多少良心做多少事)。所以大部份語言有提供一些機制,簡化因例外拋出要處理的資源釋放機制,例如 C++ 的 RAII (Resource acquisition is initialization),簡單說,由物件的建構子取得資源,解構子釋放資源,物件的生命週期隨著例外消逝的話,C++ 就能確保資源能確實地被釋放。C# 有 using 的語法,Java 則在 Java 7 之後有 try-resources 的語法,避免開發者如上例那樣忘記在 finally 區塊釋放資源。
Objective C 雖然有@try、@catch 和 @finally 關鍵字與拋出 exception 的機制,但個人好像沒有用到哪個 API 是以例外的方式處理錯誤,這麼說不太精確,runtime 還是會拋出例外,但都是像 NullPointerException 這種類型的例外,本來就不是用捕捉的方式處理,實際上官方也是建議例外只用在 runtime 錯誤上:
You should reserve the use of exceptions for programming or unexpected runtime errors such as out-of-bounds collection access, attempts to mutate immutable objects, sending an invalid message, and losing the connection to the window server. You usually take care of these sorts of errors with exceptions when an application is being created rather than at runtime. — 《Introduction to Exception Programming Topics for Cocoa》
其他則以 NSError 物件的方式處理:
為了與 Objective C 的 runtime 相容,Swift 錯誤處理機制大致與 Objective C 相同,不過,Swift 和 Java 一樣希望有更安全的語言,所以和 Java 一樣可以在 function 上加上 throws 的宣告,但不用宣告拋出的例外類型,因此也不用擔心介面演變 (interface evolution):