Ich habe nicht zu viel in Swift gelesen, aber eines ist mir aufgefallen, dass es keine Ausnahmen gibt. Wie machen sie die Fehlerbehandlung in Swift? Hat jemand etwas im Zusammenhang mit der Fehlerbehandlung gefunden?
swift
error-handling
Peko
quelle
quelle
Antworten:
Swift 2 & 3
In Swift 2 haben sich die Dinge ein wenig geändert, da es einen neuen Fehlerbehandlungsmechanismus gibt, der Ausnahmen etwas ähnlicher ist, sich jedoch im Detail unterscheidet.
1. Anzeige der Fehlermöglichkeit
Wenn die Funktion / Methode angeben möchte, dass sie möglicherweise einen Fehler auslöst, sollte sie ein
throws
Schlüsselwort wie dieses enthaltenHinweis: Es gibt keine Spezifikation für die Art des Fehlers, den die Funktion tatsächlich auslösen kann. Diese Deklaration besagt lediglich, dass die Funktion eine Instanz eines beliebigen Typs auslösen kann, der ErrorType implementiert, oder überhaupt nicht auslöst.
2. Aufrufen einer Funktion, die Fehler auslösen kann
Um die Funktion aufzurufen, müssen Sie das Schlüsselwort try wie folgt verwenden
Diese Zeile sollte normalerweise wie folgt vorhanden sein
Hinweis: Die catch-Klausel nutzt alle leistungsstarken Funktionen des Swift-Mustervergleichs, sodass Sie hier sehr flexibel sind.
Sie können den Fehler weitergeben, wenn Sie eine Wurffunktion von einer Funktion aus aufrufen, die selbst mit dem
throws
Schlüsselwort markiert ist :Alternativ können Sie die Wurffunktion aufrufen, indem Sie
try?
:Auf diese Weise erhalten Sie entweder den Rückgabewert oder Null, wenn ein Fehler aufgetreten ist. Auf diese Weise erhalten Sie das Fehlerobjekt nicht.
Das bedeutet, dass Sie auch
try?
nützliche Aussagen wie:oder
Schließlich können Sie entscheiden, dass Sie wissen, dass ein Fehler nicht tatsächlich auftritt (z. B. weil Sie bereits überprüft haben, ob die Voraussetzungen erfüllt sind), und das
try!
Schlüsselwort verwenden:Wenn die Funktion tatsächlich einen Fehler auslöst, wird in Ihrer Anwendung ein Laufzeitfehler angezeigt, und die Anwendung wird beendet.
3. Einen Fehler auslösen
Um einen Fehler auszulösen, verwenden Sie das Schlüsselwort throw wie dieses
Sie können alles werfen, was dem
ErrorType
Protokoll entspricht . Für den AnfangNSError
entspricht dies diesem Protokoll, aber Sie möchten wahrscheinlich enum-based verwendenErrorType
, mit dem Sie mehrere verwandte Fehler gruppieren können, möglicherweise mit zusätzlichen Daten wie diesenDie Hauptunterschiede zwischen dem neuen Swift 2 & 3-Fehlermechanismus und Ausnahmen im Java / C # / C ++ - Stil sind folgende:
do-catch
+try
+defer
vs traditionelletry-catch-finally
Syntax.do-catch
Block fängt keine NSException ab und umgekehrt, dafür müssen Sie ObjC verwenden.NSError
Konventionen der Cocoa- Methode kompatibel, bei denen entwederfalse
(für dieBool
Rückgabe von Funktionen) odernil
(für dieAnyObject
Rückgabe von Funktionen) zurückgegeben undNSErrorPointer
Fehlerdetails übergeben werden.Als zusätzlichen synthetischen Zucker zur Vereinfachung der Fehlerbehandlung gibt es zwei weitere Konzepte
defer
Schlüsselworts), mit denen Sie den gleichen Effekt erzielen können wie beim endgültigen Blockieren in Java / C # / etc.guard
Schlüsselwort), mit der Sie etwas weniger if / else-Code schreiben können als im normalen Fehlerprüf- / Signalisierungscode.Schnell 1
Laufzeitfehler:
Wie Leandros zur Behandlung von Laufzeitfehlern (wie Netzwerkverbindungsproblemen, Analysieren von Daten, Öffnen von Dateien usw.)
NSError
vorschlägt, sollten Sie diese wie in ObjC verwenden, da Foundation, AppKit, UIKit usw. ihre Fehler auf diese Weise melden. Es ist also mehr Rahmensache als Sprachsache.Ein weiteres häufiges Muster, das verwendet wird, sind Separator-Erfolgs- / Fehlerblöcke wie in AFNetworking:
Trotzdem hat der Fehlerblock häufig eine
NSError
Instanz empfangen , die den Fehler beschreibt.Programmiererfehler:
Für Programmiererfehler (z. B. Zugriff außerhalb des Bereichs auf Array-Elemente, ungültige Argumente, die an einen Funktionsaufruf übergeben wurden usw.) haben Sie Ausnahmen in ObjC verwendet. Swift Sprache scheint keine Sprachunterstützung für Ausnahmen zu haben (wie
throw
,catch
etc Schlüsselwort). Wie aus der Dokumentation hervorgeht, läuft es jedoch zur gleichen Laufzeit wie ObjC, und daher können Sie immer noch Folgendes werfenNSExceptions
:Sie können sie einfach nicht in reinem Swift abfangen, obwohl Sie sich möglicherweise dafür entscheiden, Ausnahmen im ObjC-Code abzufangen.
Die Frage ist, ob Sie Ausnahmen für Programmiererfehler auslösen oder Behauptungen verwenden sollten, wie Apple im Sprachhandbuch vorschlägt.
quelle
fatalError(...)
ist auch das gleiche.Update 9. Juni 2015 - Sehr wichtig
Swift 2.0 kommt mit
try
,throw
undcatch
Keywords und die aufregendste ist:Auszug aus: Apple Inc. "Verwenden von Swift mit Kakao und Objective-C (Swift 2 Prerelease)." iBooks.
Beispiel: (aus dem Buch)
Das Äquivalent in schnell wird sein:
Fehler auslösen:
Wird automatisch an den Anrufer weitergegeben:
Aus Apple-Büchern, The Swift Programming Language, geht hervor, dass Fehler mit enum behandelt werden sollten.
Hier ist ein Beispiel aus dem Buch.
Von: Apple Inc. "Die schnelle Programmiersprache". iBooks. https://itun.es/br/jEUH0.l
Aktualisieren
Aus Apple-Nachrichtenbüchern "Verwenden von Swift mit Kakao und Objective-C". Laufzeitausnahmen treten nicht in schnellen Sprachen auf, daher haben Sie keinen Try-Catch. Stattdessen verwenden Sie die optionale Verkettung .
Hier ist eine Strecke aus dem Buch:
Auszug aus: Apple Inc. "Verwenden von Swift mit Kakao und Objective-C." iBooks. https://itun.es/br/1u3-0.l
In den Büchern wird außerdem empfohlen, das Kakaofehlermuster von Objective-C (NSError Object) zu verwenden.
Auszug aus: Apple Inc. "Verwenden von Swift mit Kakao und Objective-C." iBooks. https://itun.es/br/1u3-0.l
quelle
In Swift gibt es keine Ausnahmen, ähnlich wie bei Objective-C.
In der Entwicklung können Sie
assert
eventuell auftretende Fehler abfangen, die vor Produktionsbeginn behoben werden müssen.Der klassische
NSError
Ansatz wird nicht geändert, Sie senden eineNSErrorPointer
, die gefüllt wird.Kurzes Beispiel:
quelle
f();g();
wirdf(&err);if(err) return;g(&err);if(err) return;
für den ersten Monat, dann ist es einfach gewordenf(nil);g(nil);hopeToGetHereAlive();
Der empfohlene "Swift Way" ist:
Ich bevorzuge jedoch try / catch, da ich es einfacher finde, zu folgen, da dadurch die Fehlerbehandlung am Ende in einen separaten Block verschoben wird. Diese Anordnung wird manchmal als "Goldener Pfad" bezeichnet. Zum Glück können Sie dies mit Verschlüssen tun:
Es ist auch einfach, eine Wiederholungsfunktion hinzuzufügen:
Die Auflistung für TryBool lautet:
Sie können eine ähnliche Klasse zum Testen eines optionalen Rückgabewerts anstelle des Bool-Werts schreiben:
Die TryOptional-Version erzwingt einen nicht optionalen Rückgabetyp, der die nachfolgende Programmierung erleichtert, z. B. 'Swift Way:
Verwenden von TryOptional:
Beachten Sie das automatische Auspacken.
quelle
Bearbeiten: Obwohl diese Antwort funktioniert, ist sie kaum mehr als Objective-C, das in Swift transkribiert wurde. Es wurde durch Änderungen in Swift 2.0 überholt. Die Antwort von Guilherme Torres Castro oben ist eine sehr gute Einführung in die bevorzugte Art der Fehlerbehandlung in Swift. VOS
Es hat ein bisschen gedauert, es herauszufinden, aber ich glaube, ich habe es verstanden. Es scheint aber hässlich. Nichts weiter als eine dünne Haut über der Objective-C-Version.
Aufruf einer Funktion mit einem NSError-Parameter ...
Schreiben der Funktion, die einen Fehlerparameter akzeptiert ...
quelle
Grundlegender Wrapper um Ziel C, der Ihnen die Try-Catch-Funktion bietet. https://github.com/williamFalcon/SwiftTryCatch
Verwenden Sie wie:
quelle
Dies ist eine Update-Antwort für Swift 2.0. Ich freue mich auf ein funktionsreiches Fehlerbehandlungsmodell wie in Java. Schließlich kündigten sie die guten Nachrichten an. Hier
z.B :
quelle
Als Guilherme Torres Castro sagte in Swift 2.0,
try
,catch
,do
kann bei der Programmierung verwendet werden.Zum Beispiel in Coredata Daten Methode holen, statt put
&error
als Parameter in diemanagedContext.executeFetchRequest(fetchRequest, error: &error)
jetzt nur Gebrauch verwenden müssen wirmanagedContext.executeFetchRequest(fetchRequest)
dann den Fehler behandeln mittry
,catch
( Apple - Document Link )Wenn Sie den xcode7 Beta bereits heruntergeladen haben. Versuchen Sie, Fehler in der Dokumentation und in der API-Referenz zu suchen , und wählen Sie das erste angezeigte Ergebnis aus. Es gibt eine grundlegende Vorstellung davon, was für diese neue Syntax getan werden kann. Für viele APIs ist jedoch noch keine vollständige Dokumentation verfügbar.
Weitere ausgefallene Techniken zur Fehlerbehandlung finden Sie in
quelle
Die Fehlerbehandlung ist eine neue Funktion von Swift 2.0. Es nutzt die
try
,throw
undcatch
Schlüsselwörter.Siehe die Ankündigung von Apple Swift 2.0 im offiziellen Apple Swift-Blog
quelle
Schöne und einfache Bibliothek , um Ausnahmen zu behandeln: TryCatchFinally-Swift
Wie einige andere werden auch die objektiven C-Ausnahmefunktionen behandelt.
Verwenden Sie es so:
quelle
Beginnend mit Swift 2 wird die Fehlerbehandlung, wie bereits erwähnt, am besten durch die Verwendung der Aufzählungen do / try / catch und ErrorType erreicht. Dies funktioniert für synchrone Methoden recht gut, für die asynchrone Fehlerbehandlung ist jedoch ein wenig Cleverness erforderlich.
Dieser Artikel hat einen großartigen Ansatz für dieses Problem:
https://jeremywsherman.com/blog/2015/06/17/using-swift-throws-with-completion-callbacks/
Zusammenfassen:
dann wäre der Aufruf der obigen Methode wie folgt:
Dies scheint etwas sauberer zu sein, als wenn ein separater errorHandler-Rückruf an die asynchrone Funktion übergeben wird. So würde dies vor Swift 2 gehandhabt.
quelle
Was ich gesehen habe, ist, dass Sie aufgrund der Art des Geräts keine Reihe von kryptischen Fehlerbehandlungsnachrichten auf den Benutzer werfen möchten. Aus diesem Grund geben die meisten Funktionen optionale Werte zurück, und Sie codieren nur, um die optionalen Werte zu ignorieren. Wenn eine Funktion auf Null zurückkommt, was bedeutet, dass sie fehlgeschlagen ist, können Sie eine Nachricht oder was auch immer einfügen.
quelle