Wie bekomme ich die Liste der Fehler, die von einer Funktion ausgelöst werden?

9

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?

    
IgnazioC 19.01.2016, 12:37
quelle

3 Antworten

4

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 :

%Vor%

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.

    
JAL 19.01.2016, 13:00
quelle
0

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: Ссылка

    
AndreG 09.08.2017 19:08
quelle
-1

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

    
John Wong 19.01.2016 12:45
quelle

Tags und Links