Was ist der beste Weg, um eine Ausnahme in objective-c/cocoa zu werfen?
Antworten
Zu viele Anzeigen?Hier ein Wort der Vorsicht. Im Gegensatz zu vielen ähnlichen Sprachen sollten Sie in Objective-C generell versuchen, Ausnahmen für häufige Fehlersituationen zu vermeiden, die im normalen Betrieb auftreten können.
Apples Dokumentation für Obj-C 2.0 steht Folgendes: "Wichtig: Ausnahmen sind in Objective-C ressourcenintensiv. Sie sollten Ausnahmen nicht für die allgemeine Ablaufsteuerung oder einfach nur zur Kennzeichnung von Fehlern (z. B. wenn auf eine Datei nicht zugegriffen werden kann) verwenden.
Apples konzeptionelle Dokumentation zur Ausnahmebehandlung erklärt das Gleiche, aber mit mehr Worten: "Wichtig: Sie sollten die Verwendung von Exceptions für Programmier- oder unerwartete Laufzeitfehler reservieren, z. B. für den Zugriff auf Sammlungen außerhalb der Grenzen, den Versuch, unveränderliche Objekte zu verändern, das Senden einer ungültigen Nachricht und den Verlust der Verbindung zum Windowsserver. Diese Art von Fehlern werden in der Regel bei der Erstellung einer Anwendung und nicht zur Laufzeit mit Exceptions behandelt. [.....] Anstelle von Ausnahmen sind Fehlerobjekte (NSError) und der Cocoa-Fehlerzustellungsmechanismus die empfohlene Methode, um erwartete Fehler in Cocoa-Anwendungen zu kommunizieren."
Die Gründe dafür sind zum einen die Einhaltung von Programmier-Idiomen in Objective-C (Verwendung von Rückgabewerten in einfachen Fällen und von By-Referenz-Parametern (oft die NSError-Klasse) in komplexeren Fällen), zum anderen, dass das Werfen und Abfangen von Ausnahmen sehr viel teurer ist und schließlich (und vielleicht am wichtigsten), dass Objective-C-Ausnahmen eine dünne Hülle um die setjmp()- und longjmp()-Funktionen von C sind, die Ihre sorgfältige Speicherbehandlung im Wesentlichen durcheinander bringen, siehe diese Erklärung .
@throw([NSException exceptionWith…])
Xcode erkennt @throw
Anweisungen als Funktionsausgangspunkte, wie return
Erklärungen. Die Verwendung der @throw
Syntax vermeidet irrtümliche " Die Kontrolle kann das Ende einer nicht-unwirksamen Funktion erreichen " Warnungen, die Sie möglicherweise von [NSException raise:…]
.
Auch, @throw
kann verwendet werden, um Objekte zu werfen, die nicht der Klasse NSException angehören.
Betreffend [NSException raise:format:]
. Diejenigen, die mit Java vertraut sind, werden sich daran erinnern, dass Java zwischen Exception und RuntimeException unterscheidet. Exception ist eine geprüfte Ausnahme, RuntimeException eine ungeprüfte. Insbesondere schlägt Java vor, geprüfte Ausnahmen für "normale Fehlerbedingungen" und ungeprüfte Ausnahmen für "Laufzeitfehler, die durch einen Programmiererfehler verursacht wurden" zu verwenden. Es scheint, dass Objective-C-Ausnahmen an denselben Stellen verwendet werden sollten, an denen Sie eine ungeprüfte Ausnahme verwenden würden, und Fehlercode-Rückgabewerte oder NSError-Werte werden an Stellen bevorzugt, an denen Sie eine geprüfte Ausnahme verwenden würden.
Ich denke, um konsistent zu sein, ist es schöner, @throw mit Ihrer eigenen Klasse zu verwenden, die NSException erweitert. Dann verwendet man die gleichen Notationen für try catch finally:
@try {
.....
}
@catch{
...
}
@finally{
...
}
Apple erklärt hier, wie man Ausnahmen auslöst und behandelt: Abfangen von Ausnahmen Das Werfen von Ausnahmen
- See previous answers
- Weitere Antworten anzeigen