Swift 2: Rufen Sie werfen kann, aber es ist nicht gekennzeichnet mit 'versuchen', und der Fehler wird nicht behandelt
Installiert, nachdem ich Xcode 7 beta und meine konvertieren swift-code, Swift 2, ich habe einige Problem mit dem code, den ich nicht herausfinden können. Ich kenne Swift 2 neu ist, damit ich die Suche und herauszufinden, da gibt es nichts über es, ich sollte schreiben eine Frage stellen.
Hier ist der Fehler:
Call werfen kann, aber es ist nicht gekennzeichnet mit 'versuchen' und der Fehler ist nicht
behandelt
Code:
func deleteAccountDetail(){
let entityDescription = NSEntityDescription.entityForName("AccountDetail", inManagedObjectContext: Context!)
let request = NSFetchRequest()
request.entity = entityDescription
//The Line Below is where i expect the error
let fetchedEntities = self.Context!.executeFetchRequest(request) as! [AccountDetail]
for entity in fetchedEntities {
self.Context!.deleteObject(entity)
}
do {
try self.Context!.save()
} catch _ {
}
}
Snapshot:
InformationsquelleAutor Farhad | 2015-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie, um den Fehler abzufangen, wenn du gerade schon dabei für Ihre
save()
nennen und da sind Sie behandeln mehrere Fehler, können Sietry
mehrere Anrufe nacheinander in einem einzigen do-catch-block, in etwa so:Oder wie @bames53 darauf hingewiesen, in den Kommentaren unten ist es oft besser, die Praxis nicht, um den Fehler abzufangen, wo Sie geworfen wurde. Sie können markieren Sie die Methode, wie
throws
danntry
Sie zum aufrufen der Methode. Zum Beispiel:Eigentlich ist es nicht erforderlich, dass die Ausnahme gefangen werden hier. Es ist möglich, fügen Sie einfach die
try
Schlüsselwort, um die Funktion nennen, und zu erklären, diese Funktion alsfunc deleteAccountDetail() throw
. Oder wenn Sie garantiert haben, dass die Funktion nicht werfen für die gegebene Eingabe, die Sie verwenden könnentry!
.Ich bringe dies nicht zu kleinlich, aber weil es eigentlich ziemlich wichtig ist, um anständig eine auf exception basierte Fehlerbehandlung, dass die meisten Orte, an denen Ausnahmen passieren, keine exceptions fangen. Es gibt drei Arten von Orten, wo fangen Ausnahmen angemessen ist. In allen anderen Orten, der code sollte nicht mit Ausnahmen explizit, und sollte sich auf implizite
deinit()
ruft zu "sauber" (d.h., RAII), oder gelegentlich verwendendefer
zu tun, einige ad-hoc-Bereinigung. Sehen exceptionsafecode.com für mehr (Es ist die Rede von C++, aber die grundlegenden Prinzipien gelten für die Swift auch Ausnahmen.)Aber wie würden Sie die Funktion ausführen? Wenn ich mit @bames53 Weg?
Was die Swift-Entwickler rufen Sie nicht machen einen Unterschied in dem, was Sie eigentlich sind. Swift ' s neues error-handling-system ist eine Implementierung von Ausnahmen, wie dieser Begriff wird Häufig verwendet, während der rest der Branche.
InformationsquelleAutor Mick MacCallum
Beim Aufruf einer Funktion deklariert ist mit
throws
Swift, müssen Sie kommentieren die Funktion aufrufen, Seite mittry
odertry!
. Zum Beispiel wird bei einer werfenden Funktion:diese Funktion kann aufgerufen werden wie:
Hier kommentieren wir das Gespräch mit
try
, die ruft dem Leser, dass diese Funktion eine Ausnahme werfen, und alle folgenden Zeilen von code kann nicht ausgeführt werden. Wir haben auch zu kommentieren, diese Funktion mitthrows
, weil diese Funktion eine Ausnahme werfen (D. H., wennwillOnlyThrowIfTrue()
wirft, dannfoo
wird automatisch rethrow die Ausnahme nach oben.Wenn Sie möchten, um eine Funktion aufzurufen, die als deklariert ist möglicherweise zu werfen, aber Sie wissen nicht werfen in Ihrem Fall, da geben Sie es korrekt eingegeben haben, können Sie verwenden
try!
.Diese Weise, wenn Sie garantieren, dass der code nicht werfen, die Sie nicht haben, um in zusätzlichen boilerplate-code zu deaktivieren Ausnahme Vermehrung.
try!
erzwungen wird zur Laufzeit: wenn Sietry!
und die Funktion tut, am Ende werfen, dann ist dein Programm die Ausführung beendet mit einem runtime error.Meisten exception-handling-code sollte wie oben Aussehen: entweder man einfach verbreiten, Ausnahmen nach oben, wenn Sie auftreten, oder Sie die Bedingungen so, dass sonst mögliche Ausnahmen sind ausgeschlossen. Alle bereinigen andere Ressourcen in Ihrem code auftreten sollte über Objekt-Zerstörung (d.h.
deinit()
), oder manchmal überdefer
ed code.Wenn Sie aus irgendeinem Grund mit sauberen code, der ausgeführt werden muss, aber nicht in einem
deinit()
Funktion, die Sie verwenden könnendefer
.Den meisten code, der sich mit Ausnahmen einfach hat, Sie propagieren nach oben, um Anrufer, dabei die Bereinigung auf dem Weg über
deinit()
oderdefer
. Dies ist, weil die meisten code nicht wissen, was zu tun mit Fehlern; es weiß, was schief lief, aber es nicht genug Informationen über das, was einige höhere level-code versucht zu tun, um zu wissen, was zu tun ist über den Fehler. Sie wissen nicht, wenn präsentiert ein Dialogfeld an dem Benutzer angebracht ist, oder wenn es sich wiederholen sollte, oder wenn etwas anderes geeignet ist.Höheren level-code, sollte aber genau wissen, was zu tun ist im Falle eines Fehlers. So Ausnahmen erlauben, bestimmte Fehler zu sprudeln, von wo Sie zunächst auftreten, die, wo Sie behandelt werden können.
Behandlung von Ausnahmen erfolgt über
catch
Aussagen.Können Sie mehrere catch-Anweisungen, die jeweils den Fang einer anderen Art von Ausnahme.
Für mehr details über best practices mit Ausnahmen, siehe http://exceptionsafecode.com/. Es ist speziell auf C++, aber nach Prüfung der Swift-Ausnahme-Modell, glaube ich, dass die Grundlagen gelten zu schnell als gut.
Details über die Swift-syntax-und Fehler-handling-Modell, siehe das Buch die Die Swift-Programmiersprache (Swift 2 Prerelease).
Ich bin mir nicht ganz sicher, was Sie Fragen, gerade mit Blick auf eine "input-Funktion', sondern auch 'fangen' ist im wesentlichen ein synonym für "Griff", die im Rahmen von Ausnahmen. Das ist zu sagen, dass man eine Ausnahme und Behandlung einer Ausnahme sind die gleiche Sache, so weit wie Programmierung Sprachen betroffen sind.
Das ist das, was ich meinte
Ich habe einen Fehler ich Stille nicht verstehen, Können Sie mir bitte helfen?
Invalid conversion from throwing function of type '() throws -> _' to non-throwing function type '(NSData?, NSURLResponse?, NSError?) -> Void'
Es klingt wie Sie eine Funktion verwenden, die mit einer falschen Unterschrift irgendwo. Etwas erwartet, gegeben zu werden, eine Funktion, die nimmt
NSData?, NSURLResponse?, NSError?
als Argumente, aber Sie geben es eine Funktion, die nimmt keine Argumente.InformationsquelleAutor bames53