Eine überprüfte Ausnahme zu einer RuntimeException machen

8

Ich arbeite an einem Legacy-System mit einer benutzerdefinierten Ausnahme, die gosh-frickity-überall verwendet wird. Es wurde von der ServletException -Klasse inspiriert, die sagte "Nun, jedes Mal, wenn Sie eine Ausnahme in Ihrem Servlet haben, wollen Sie diese ServletException " werfen.

Mit der Entwicklung des Systems (über 10 Jahre) hat ein robusteres System zum Abfangen der Ausnahmen auf einer höheren Ebene stattgefunden, und es ist nicht länger notwendig, jede Ausnahme in diese benutzerdefinierte Ausnahme zu verpacken. (Man könnte argumentieren, dass es das nie war, aber das ist eine andere Geschichte. Es ist eine stabile App, also täusche ich mich nicht zu sehr !!) Aber wir werden sie nicht alle auf einmal umgestalten, nur langsam im Laufe der Zeit. p>

Eine Sache, die die Zukunft vereinfachen würde, wäre jedoch, wenn die benutzerdefinierte Ausnahme eine Laufzeitausnahme anstelle einer geprüften Ausnahme wäre. Auf diese Weise müssen wir sie nicht überall explizit abfangen, und Legacy-Code, der noch nicht refaktoriert wurde, wird weiterhin genauso ausgegeben, wie sie eine Nullzeiger-Ausnahme auslösen würde, falls eine solche auftritt.

Meine Frage ist ... Was sind die Nebenwirkungen einer einmal geprüften Ausnahme, die zu einer Laufzeitausnahme wird?

Ich kann mir keine vorstellen, abgesehen von Warnungen für unnötige Überprüfung und Würfe, aber es wäre nett, von jemandem, der diesen Weg schon einmal gegangen ist, etwas zu erfahren.

    
corsiKa 29.08.2014, 14:40
quelle

3 Antworten

2

Das Ändern einer geprüften Ausnahme in eine ungeprüfte Ausnahme hat sehr wenig praktische Auswirkungen auf existierenden, funktionierenden Code, aber Sie müssen auf die Möglichkeit achten, dass Sie irgendwo in Ihrem Code catch (RuntimeException ...) haben. Solche Fänge fangen Ihre benutzerdefinierte Ausnahme jetzt nicht ab, aber sie würden es tun, wenn Sie sie nicht aktivieren.

Sie könnten auch auf Probleme stoßen, wenn Sie etwas tun, das sich auf Methoden bezieht, die diese Ausnahme auslösen (was anscheinend die meisten sind).

    
John Bollinger 29.08.2014 14:50
quelle
0

So etwas passierte auf einem alten Modul einer App, die ich pflegen musste. Das einzige Problem beim Übersetzen von Ausnahmen in Runtime ist, dass Sie die Granularität verlieren, aber das liegt ganz bei Ihnen.

Zum Beispiel hatten wir eine Menge Code in den tieferen Schichten:

%Vor%

Wir haben dieses Muster achtlos über die ganze Ebene hinweg verwendet, und wenn wir die Ursache der Ausnahme überprüfen mussten, mussten wir immer die Ursache für die Ausnahme finden, und das hat in höheren Ebenen eine Menge Vortex gemacht. Bis heute glaube ich, dass es besser ist, eine gute Klassenhierarchie von nicht geprüften Ausnahmen zu erstellen, um die Granularität zu erhalten. z.B.

%Vor%

Und damit können Sie die Ausnahme in anderen Layern leicht abfangen und Fehler und Fallbacks leicht teilen:

%Vor%     
ElderMael 29.08.2014 14:53
quelle
0

Hier sind einige, an die ich denken kann

  • Runtime-Exceptions könnten möglicherweise zu einer Ebene führen, auf die Sie nicht hinwollen.
    • ex: ein Servlet --- & gt; Service --- & gt; DAO. Laufzeitausnahmen, die von DAO im Zusammenhang mit Datenbankinteraktionen ausgelöst werden, können möglicherweise auf Servlet landen. Die klare Trennung der Layer, bei denen jeder Layer alle Ausnahmen (checked / runtime) an seinen Eingangspunkten behandelt, kann sicherstellen, dass dies nicht geschieht.
  • Laufzeitausnahmen können das System in einem inkonsistenten Zustand belassen.
    • ex: Wenn das Sequenzdiagramm wie Klasse A aussieht - & gt; Klasse B --- & gt; Klasse C und wenn Klasse B1 zwischen B und C eingespritzt wird, daher Klasse A --- & gt; Klasse B --- & gt; Klasse B1 --- & gt; Klasse C dann weder Klasse A, B, B1 würde wissen, dass sie möglicherweise bereinigen müssen, wenn diese Laufzeitausnahme in Klasse C auftritt. Tatsächlich kann dies die Semantik einer Abhängigkeitsinjektion beeinflussen.

Als allgemeine Daumenregel meiner Meinung nach:

  • Verwenden Sie geprüfte Ausnahmen, wenn Sie die Ausnahme als Teil eines normalen Kontrollflusses "erwarten" und wissen, wie Sie damit umgehen. ex: Bei der Validierung einer Geschäftsregel muss der Kontostand um mindestens 100 höher sein als der Sollbetrag.
  • Verwenden Sie ungeprüfte Ausnahmen, wenn Sie die Ausnahme nicht als Teil eines normalen Kontrollflusses erwarten und daher keine Möglichkeit haben, sie zu handhaben. Sie wissen jedoch, dass "irgendeine Klasse" innerhalb Ihrer "Ebene" dies handhaben würde, um eine gradeose Verschlechterung zu gewährleisten ex: Die verloren gegangene DB-Verbindung wäre von Ihrer "Service" -Layer-Eintragsklasse behandelt worden.
  • Benutze nie einen Fehler. Nur JRE hat Gründe, Fehler zu werfen.
sandeepkunkunuru 29.08.2014 15:16
quelle

Tags und Links