Ich hatte genau die gleiche Frage wie das OP. Da niemand die Frage wirklich beantwortet hat (und ich auch), geht hier mein Beitrag.
In Swift 3 und Xcode 8.3.3 würden Sie wie folgt vorgehen, um die einzelnen Ausnahmen zu behandeln. Im Folgenden werde ich Ihnen ein Beispiel mit FileManager geben.
Zuerst haben Sie nur einen catch-Block, um den Fehler zu erfassen, den die Methode Ihnen zufügt. Dann werden Sie diesen Fehler als NSError auslösen. Im Gegensatz zum Fehlerprotokoll in Swift ist NSError eine REAL-Fehlerklasse. Dann können Sie den Code dieses Fehlers in einer switch-Anweisung extrahieren. Sie müssen wissen, von welcher Domäne diese Methode Fehler auslöst, und dann die Fehlercodes in der entsprechenden Header-Datei finden.
In meinem Beispiel unten werden die Dateifehler in der NSCOAErrorDomain ausgelöst und diese Fehlercodes sind in Foundation/FoundationErrors.h definiert/aufgelistet.In meinem Computer, werden sie bei
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/FoundationErrors.h
für Mac OS-Anwendungen und bei
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers/
für iPhone-Apps entfernt.
So, hier ist ein Beispiel:
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()
}
}
Die .localizedDescription
enthält eine benutzerfreundliche Nachricht in der Sprache Ihres Benutzers zu diesem Fehler. Wenn die Datei oben nicht gefunden wird, wird The file “file” couldn’t be opened because there is no such file.
in Englisch gedruckt. Es soll direkt in den Fehlerdialogen verwendet werden, die Sie Ihrem Benutzer präsentieren.
Sie können auch weitere Informationen finden, welche Fehler von jeder Domain hier geworfen wird: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorObjectsDomains/ErrorObjectsDomains.html
Unfortanely, Sie haben dokumentation (API) zu überprüfen. Sei vorsichtig, es gibt keine Ausnahme werfen, sondern Fehler werfen. Wenn Sie nach einer Möglichkeit suchen, den Codefluss zu organisieren, verwenden Sie stattdessen die richtige Überprüfung. Fangwurffehler ist die letzte Chance, sich davon zu erholen, Sie können sich nicht von einer Ausnahme erholen. – user3441734
[Siehe auch diese verwandte Frage und die akzeptierte Antwort.] (Http://stackoverflow.com/questions/31977738/how-to-find-the-kind-of-errors-a-method-may-throw-and- catch-sie-in-swift) – Suragch