Ich möchte in Swift 2 etwas tun, das ich in mehreren anderen Sprachen gewohnt bin: eine Laufzeitausnahme mit einer benutzerdefinierten Nachricht auslösen. Zum Beispiel (in Java):
throw new RuntimeException("A custom message here")
Ich verstehe, dass ich Aufzählungstypen auslösen kann, die dem ErrorType-Protokoll entsprechen, aber ich möchte nicht für jeden Fehlertyp Aufzählungen definieren müssen. Im Idealfall möchte ich das obige Beispiel so genau wie möglich nachahmen können. Ich habe versucht, eine benutzerdefinierte Klasse zu erstellen, die das ErrorType-Protokoll implementiert, aber ich kann nicht einmal herausfinden, was dieses Protokoll erfordert (siehe Dokumentation ). Ideen?
Antworten:
Der einfachste Ansatz ist wahrscheinlich zu definieren , eine benutzerdefinierte
enum
mit nur einercase
, der eine hatString
an sie:Oder ab Swift 4:
Beispiel Verwendung wäre so etwas wie:
Wenn Sie vorhandene
Error
Typen verwenden möchten , ist der allgemeinste einNSError
, und Sie können eine Factory-Methode erstellen, um einen mit einer benutzerdefinierten Nachricht zu erstellen und zu werfen.quelle
String
in Ihr Inneres zu gelangenerrorMessage
. Wenn ja, wie mache ich das?String
ist hier mit demMyError.RuntimeError
(zum Zeitpunkt vonthrow
) festgelegten verknüpft , und Sie erhalten Zugriff auf dascatch
(mitlet errorMessage
).try!
, was hier nicht verwendet wird. Sie können in der Tat nicht einmal den potenziell werfenden Anruf ohne irgendeine Art von tätigentry
. (Auch dieser Teil des Codes ist die Beispielverwendung, nicht die eigentliche Lösung.)Der einfachste Weg ist, sich
String
anzupassen anError
:Dann können Sie einfach eine Zeichenfolge werfen:
Um die Zeichenfolge selbst
localizedString
zum Fehler zu machen, können Sie stattdessen Folgendes erweiternLocalizedError
:quelle
localizedDescription
es zur Saite selbst zu machen ?Redundant conformance of 'String' to protocol 'Error'
:(error.localizedDescription
nach dem Werfen eines Strings nicht abgeschlossen werden kann .Die Lösung von @ nick-keets ist am elegantesten, aber im Testziel ist sie mit dem folgenden Fehler bei der Kompilierung zusammengebrochen:
Redundant conformance of 'String' to protocol 'Error'
Hier ist ein anderer Ansatz:
Und zu verwenden:
quelle
Schauen Sie sich diese coole Version an. Die Idee ist, sowohl String- als auch ErrorType-Protokolle zu implementieren und den rawValue des Fehlers zu verwenden.
Verwendung:
quelle
as User.UserValidationError
und darüber hinaus das benötigen.rawValue
. Wenn Sie jedoch stattdessenCustomStringConvertible
als implementiert habenvar description: String { return rawValue }
, kann es hilfreich sein, die benutzerdefinierten Beschreibungen mithilfe der Enum-Syntax abzurufen, ohne sie anrawValue
jeder Stelle durchgehen zu müssen, an der Sie sie drucken.Swift 4:
Wie folgt:
https://developer.apple.com/documentation/foundation/nserror
Wenn Sie keine benutzerdefinierte Ausnahme definieren möchten, können Sie ein Standard-NSError-Objekt wie folgt verwenden:
Drucke:
Auf diese Weise können Sie eine benutzerdefinierte Zeichenfolge sowie einen numerischen Code und ein Wörterbuch mit allen zusätzlichen Daten eines beliebigen Typs bereitstellen.
NB: Dies wurde unter OS = Linux (Ubuntu 16.04 LTS) getestet.
quelle
Einfachste Lösung ohne zusätzliche Erweiterungen, Aufzählungen, Klassen usw.
quelle
raise()
stattthrow
) Zauber, der schwer zu merken ist. Vergleichen Sie Ihre Lösung mitthrow Foo.Bar("baz")
oderthrow "foo"
multiplizieren Sie sie mit der Anzahl der Stellen, an denen eine Ausnahme ausgelöst wird. IMO ist die einmalige Gebühr für eine einzeilige Nebenstelle oder Aufzählung weitaus besser als solcheNSExceptionName
.postNotification
2-3 Parameter und sein Selektor ähnelt diesem. Überschreiben SieNotification
und / oderNotificationCenter
in jedem Projekt, damit es weniger Eingabeparameter akzeptiert?String
zu erweitern , um sich anzupassenError
, oder ob eineMyError
Aufzählung zu vage ist (persönlich würde ich auf beide mit Ja antworten und stattdessen für jeden Fehler einen separaten Aufzählungsfall erstellen, d. H.throw ThisTypeOfError.thisParticularCase
).Basierend auf der Antwort von @Nick keets ist hier ein vollständigeres Beispiel:
Ursprünglich auf meinem schnellen Blog veröffentlicht: http://eon.codes/blog/2017/09/01/throwing-simple-errors/
quelle
throw NSError(message: "err", code: 0)
domain
nichtmessage
richtig sein?Falls Sie den Fehler nicht abfangen müssen und die Anwendung sofort stoppen möchten, können Sie einen fatalError verwenden:
fatalError ("Custom message here")
quelle
Ich mag die Antwort von @ Alexander-Borisenko, aber die lokalisierte Beschreibung wurde nicht zurückgegeben, wenn sie als Fehler abgefangen wurde. Es scheint, dass Sie stattdessen LocalizedError verwenden müssen:
Siehe diese Antwort für weitere Details.
quelle