Swift hat keinen Mechanismus, um alle willkürlichen Laufzeitausnahmen abzufangen. Die Gründe erläutert in
auf den swift-users Mailingliste. Auszug:
Swift machte eine bewusste Entscheidung nicht Ausnahmen durch beliebigen Stapelrahmen geworfen, um nicht weil es technisch unmöglich war, aber weil die Designer die Kosten beurteilt zu hoch sein.
Das Problem ist das: Wenn ein Stück Code vorzeitig beendet wird, weil einen Fehler hat, muss es geschrieben werden, um diesen frühen Ausgang zu behandeln. Sonst wird es Fehlverhalten-Fehler beim Freigeben von Speicher, Scheitern Datei zu schließen Griffen/Sockets/Datenbankverbindungen/was auch immer, nicht Sperren freigeben, usw. In einer Sprache wie Java, schreiben wirklich Ausnahme-sichere Code erfordert eine lächerliche Menge von try/finally blockt. Deshalb macht niemand es. Sie beurteilen, welche Ausnahmen sie wahrscheinlich sehen und welche Ressourcen gefährlich sind, und nur schützen ihren Code vor diesen spezifischen erwarteten Bedingungen. Dann passiert etwas unvorhergesehenes und ihr Programm bricht.
Dies ist noch schlimmer in einer Referenzzählung Sprache wie Swift, weil richtig die Referenzzahlen in Gegenwart von Ausnahmen Ausgleich grundsätzlich jede Funktion erfordert eine implizite schließlich blockieren aufzunehmen, um das Gleichgewicht der alle Zählungen behalten. Dies bedeutet, dass der Compiler viel zusätzlichen Code auf die Chance, dass einige Anrufe oder andere eine Ausnahme auslösen generiert. Die überwiegende Mehrheit dieses Codes wird nie, jemals verwendet, aber es muss da sein, Blähungen den Prozess.
Aufgrund dieser Probleme entschied Swift, keine traditionellen Ausnahmen zu unterstützen; Stattdessen können Sie nur Fehler in speziell markierten Codebereichen auslösen. Aber als Konsequenz bedeutet dies, dass wenn etwas wirklich schief geht in Code, der nicht werfen kann, kann es wirklich tun, um ein Desaster zu verhindern Absturz. Und derzeit ist das einzige, was Sie zum Absturz bringen können, der gesamte Prozess.
NSSetUncaughtExceptionHandler verfügbar ist, ist Swift: http://stackoverflow.com/questions/25441302/how-should-i-use-nssetuncaughtexceptionhandler-in-swift. Es fängt jedoch nur Objective-C-Ausnahmen, nicht Swift-Laufzeitfehler oder 'throw'n-Fehler. –
Danke @MartinR für Ihre schnelle Antwort. Ich weiß über NSSetUncaughtExceptionHandler, dass es Objective-C-Ausnahmen behandelt. Allerdings suche ich für Swift die gleiche/ähnliche Sache. –
Swift hat keinen Mechanismus, um alle Arten von Laufzeitfehlern abzufangen. Ich kann nur über den Grund raten. Zum Beispiel würde es mit der automatischen Referenzzählung nicht gut funktionieren. Sie können möglicherweise eine bessere Antwort von den Swift-Entwicklern auf einer der Mailinglisten bei swift.org erhalten. –