426 Stimmen

eine Ausnahme in objective-c/cocoa auslösen

Was ist der beste Weg, um eine Ausnahme in objective-c/cocoa zu werfen?

537voto

e.James Punkte 112528

J'utilise [NSException raise:format:] wie folgt:

[NSException raise:@"Invalid foo value" format:@"foo of %d is invalid", foo];

259voto

harms Punkte 8678

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 .

62voto

Peter Hosey Punkte 94684
@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.

33voto

Daniel Yankowsky Punkte 6835

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.

15voto

rustyshelf Punkte 44575

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X