Ich bin der Meinung, dass die falsche Frage gestellt wurde.
Was die Kosten der Ausnahmen sind, ist nicht von Nutzen, nützlicher sind die Kosten der Ausnahmen im Vergleich zur Alternative. Sie müssen also messen, wie viel Ausnahmen kosten, und dies mit der Rückgabe von Fehlercodes vergleichen >>>AND<<< die Fehlercodes auf jeder Ebene der Stapelabwicklung überprüfen.
Beachten Sie auch, dass Sie Ausnahmen nicht verwenden sollten, wenn Sie die Kontrolle über alles haben. Innerhalb einer Klasse ist die Rückgabe eines Fehlercodes wahrscheinlich eine bessere Technik. Ausnahmen sollten verwendet werden, um die Kontrolle zur Laufzeit zu übertragen, wenn Sie nicht bestimmen können, wie (oder in welchem Kontext) Ihr Objekt zur Laufzeit verwendet werden wird.
Grundsätzlich sollte es dazu dienen, die Kontrolle auf eine höhere Kontextebene zu übertragen, wo ein Objekt mit genügend Kontext weiß, wie die Ausnahmesituation zu behandeln ist.
In Anbetracht dieser einfachen Verwendung sehen wir, dass Ausnahmen verwendet werden, um die Kontrolle über mehrere Ebenen im Stapelrahmen zu übertragen. Betrachten Sie nun den zusätzlichen Code, den Sie schreiben müssen, um einen Fehlercode auf demselben Aufrufstapel nach oben zu übertragen. Bedenken Sie die zusätzliche Komplexität, die entsteht, wenn Fehlercodes aus mehreren verschiedenen Richtungen kommen können, und versuchen Sie, all die verschiedenen Arten von Fehlercodes zu koordinieren.
Anhand dieses Beispiels können Sie sehen, wie Ausnahmen den Codefluss erheblich vereinfachen können, und Sie können die erhöhte Komplexität des Codeflusses erkennen. Die Frage ist dann, ob Ausnahmen teurer sind als die komplexen Fehlerbedingungstests, die bei jedem Stack-Frame durchgeführt werden müssen.
Die Antwort hängt wie immer davon ab (machen Sie beide Profile und verwenden Sie die Quicklist, wenn Sie das brauchen).
Aber wenn Geschwindigkeit nicht der einzige Preis ist.
Die Wartungsfreundlichkeit ist ein Kostenfaktor, der gemessen werden kann. Mit dieser Metrik der Kosten Ausnahmen immer gewinnen, da sie letztlich die constrol Fluss des Codes zu nur die Aufgabe, die getan werden muss, nicht die Aufgabe und Fehlerkontrolle zu machen.
22 Stimmen
Sie sollten keine Ausnahmen für die allgemeine Logikbehandlung in Java verwenden.
8 Stimmen
@Bill: s/in Java/EVER/ Sie werden nicht umsonst "Ausnahmen" genannt; sie sind außergewöhnlich.
0 Stimmen
@Pesto: Ich stimme zu, aber ich sprach mehr über die Tatsache, dass der OP zu denken schien, es sei gängige Praxis in Java speziell.
1 Stimmen
Warum glauben Sie, dass sich C++0x-Ausnahmen so sehr von anderen Ausnahmen unterscheiden werden? Ich denke, dass die meisten Unterschiede zwischen den Implementierungen bestehen.
0 Stimmen
Ok.. Python als Beispiel also?
1 Stimmen
Für Ausnahmen fallen Kosten an. Aber das sollte Sie nicht beunruhigen. Es sollte der Unterschied in den Kosten zwischen der Verwendung von Ausnahmen und erhalten die gleichen Informationen aus, ohne Ausnahmen (so einen Fehlercode >>>>AND<<<<< Überprüfung auf jeder Ebene des Rückrufs zurückgeben). Ich wette, dass die Kosten ungefähr gleich hoch sind. Der Unterschied ist der sauberere Code (und damit die Wartbarkeit).
1 Stimmen
Könnten Sie erklären, wie mein Benchmark geändert werden sollte, damit Sie eine Chance haben, diese Wette zu gewinnen? Meine "Thrower"-Funktion führt nur einen Aufruf aus und gibt void zurück. Meine "returner"-Funktion führt einen Aufruf aus, prüft den Rückgabewert und gibt entsprechend Erfolg oder Misserfolg zurück. Die "Thrower"-Funktion ist eindeutig langsamer, wenn auch nicht langsam genug, um die meisten Anwendungen zu stören.