Mit Swift sind nun einige Funktionen mit throws
markiert, was die Entwickler zwingt, die Funktion innerhalb eines do - try catch
-Blocks aufzurufen.
Aber wie kann der Entwickler die Liste der verschiedenen Ausnahmen kennen, die von dieser Funktion ausgelöst werden?
Als Referenz ist hier eine Zeile Java-Code:
%Vor% Hier ist klar, dass die Ausnahmen 2 MyExceptionA
und MyExceptionB
sind und der Entwickler kann entscheiden, je nach Fehler unterschiedlich zu handeln.
Können wir dasselbe auf Swift erreichen?
Wenn die Swift-Dokumentation eine Funktion throws
sagt, bedeutet das, dass sie eine ErrorType
(in Cocoa-APIs normalerweise eine NSError
) auslöst, keine Ausnahme.
Betrachten Sie den folgenden do-try-catch
-Fluss für NSFileManager
s createDirectoryAtPath
:
createDirectoryAtPath
wird fehlschlagen, weil das Dokumentenverzeichnis bereits existiert. Das dynamicType
von error
zu protokollieren zeigt, dass es tatsächlich ein Objekt NSError
ist:
%Vor%
Um die verschiedenen Arten von Fehlern zu sehen, die eine Funktion throw
haben kann, müssten Sie error
auf Informationen untersuchen, um den Typ des geworfenen Fehlers zu bestimmen und wie mit jedem Fehler umzugehen ist. Im Fall von NSError
wäre dies die Domäne, der Code und die Beschreibung.
In diesem speziellen Fall existiert bereits ein Verzeichnis in diesem Pfad, sodass der Dateimanager kein neues Verzeichnis erstellen kann. Ein Beispiel für einen anderen Grund, warum diese Operation fehlschlagen könnte, wäre, wenn der Dateimanager keinen Schreibzugriff hätte. Das wäre der Fehlercode 256.
Ich hatte genau die gleiche Frage wie das OP. Da niemand wirklich die Frage beantwortete, wie er gefragt hat (und ich auch), hier mein Beitrag.
In Swift 3 und Xcode 8.3.3 würden Sie wie folgt vorgehen, um die einzelnen Ausnahmen zu behandeln. Unten gebe ich Ihnen ein Beispiel mit FileManager.
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 NSCoaErrorDomain ausgegeben und diese Fehlercodes sind in Foundation / FoundationErrors.h definiert / aufgelistet. In meinem Computer befinden sie sich bei
%Vor%für MacOS-Apps und
%Vor%für iPhone Apps.
Hier ist ein Beispiel:
%Vor% Der .localizedDescription
enthält eine benutzerfreundliche Nachricht in der Sprache Ihres Benutzers über diesen Fehler. Wenn die Datei nicht darüber 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 finden möglicherweise auch weitere Informationen darüber, welcher Fehler von jeder Domäne ausgelöst wird: Ссылка
Sie schreiben ein Muster nach catch, um anzugeben, mit welchen Fehlern diese Klausel umgehen kann.
%Vor%Siehe Abschnitt Umgang mit Fehlern bei Do-Catch von Swift-Programmiersprache
Tags und Links ios error-handling swift nserror