我有與OP完全相同的問題。由於沒有人真正回答這個問題(和我一樣),這裏是我的貢獻。
在Swift 3和Xcode 8.3.3中,您可以按如下方式處理個別異常。下面我會給你一個FileManager的例子。
首先,您將只有一個catch塊來捕捉方法拋出的錯誤。然後你將把這個錯誤當作NSError。與Swift中的錯誤協議相反,NSError是一個REAL錯誤類。然後,您可以在switch語句中提取該錯誤的代碼。您將必須知道該方法從哪個域引發錯誤,然後在適當的頭文件中找到錯誤代碼。
在我下面的例子中,文件相關的錯誤在NSCocoaErrorDomain中拋出,這些錯誤代碼在Foundation/FoundationErrors.h中定義/列出。在我的電腦,它們分別位於
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/FoundationErrors.h
適用於MacOS應用程序,並在
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/
的iPhone應用程序。
所以這裏有一個例子:
let home = FileManager.default.homeDirectoryForCurrentUser
let file = home.appendingPathComponent("file")
do {
let loadedString = try String(contentsOf: file)
}
catch {
let realError = error as NSError // As weird as it looks, Xcode actually wants this forced conversion
print(realError.localizedDescription)
switch realError.code {
case 257: // No permission
handleNoPermission()
case 260: // File not found
handleFileNotFound()
default:
handleUndefinedError()
}
}
的.localizedDescription
包含用戶的有關錯誤語言的用戶友好的消息。如果上面沒有找到文件,則打印:The file 「file」 couldn’t be opened because there is no such file.
英文。它意味着直接用在您向用戶展示的錯誤對話框中。
你也可能會發現什麼錯誤是由這裏的每個域拋出的更多信息:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
Unfortanely,你必須檢查dokumentation(API)。要小心,沒有異常拋出,但拋出錯誤。如果您正在尋找如何組織代碼流的方法,請改用適當的檢查。捕捉拋出錯誤是您最後一次從中恢復的機會,您無法從異常中恢復。 – user3441734
[另請參閱此相關問題和接受的答案。](http://stackoverflow.com/questions/31977738/how-to-find-the-kind-of-errors-a-method-may-throw-and-趕上他們在迅速) – Suragch