2015-06-09 4 views
7

Es scheint, dass Swift 2.0 hat sich von traditionellen ObjC (NSError zurück) und Swift 1.X (Erfolg/Fehler optionals) Konventionen geändert Laufzeitfehlerbehandlung zu etwas, das der Ausnahmebehandlung in Sprachen wie Java/C#/C++/etc sehr ähnlich sieht.Was ist der Unterschied zwischen Swift 2.0 do-try-catch und regulären Java/C#/C++ Ausnahmen

Apple hat traditionell emphasized use of NSError instead of throwing NSException for runtime errors (vs Programmierer Fehler), wie NSException Stack Unwinding könnte Speicherverluste mit Standard ObjC Compilereinstellungen verursachen.

Jetzt haben sie jedoch etwas entwickelt, das den traditionellen Ausnahmen sehr, sehr ähnlich sieht. Meine Frage ist:

Gibt es echte Unterschiede zwischen Swift 2.0 Fehlerbehandlung und traditioneller Ausnahme neben Nomenklatur Handhabung (Fehler vs Ausnahme) und Syntax (do-catch, statt Try-Catch, versucht vor Methode Anruf usw.).

+1

von Apple erwähnt (in Verwendung Swift mit Cocoa und ObjC), dass Swift 'do-catch' Anweisungen arbeiten mit NSError Methoden automatisch zurückkehr (mit einigen Code Konventionen), aber fangen Sie keine NSExceptions ab, die von ObjC-Code ausgelöst werden. – MDJ

Antwort

7

Es gibt drei große Unterschiede habe ich gefunden:

  1. Es ist nicht notwendig, alle Fehler eine Funktion werfen können zur Liste nur ein throws Schlüsselwort benötigt wird.

  2. Es gibt keine signifikante Verlangsamung, wenn diese Fehler verwendet werden, während Java und andere Sprachen ein Exception Objekt erstellen und den Stapel auflösen müssen. In Swift kann ein throws Schlüsselwort als die Funktion angesehen werden, die ein Either -Objekt zurückgibt, wobei eins der ursprüngliche Rückgabetyp und der andere ein ErrorType Wert ist.

  3. In Swift müssen alle Fehler behandelt oder deklariert werden, es ist unmöglich, einen Fehler von einer Methode zu erhalten, die nicht angibt, dass sie einen Fehler verursacht. (In Java Begriffe, alle Fehler "geprüfte Ausnahmen")

Verwandte Themen