Worin besteht in Java der Unterschied zwischen dem Abfangen einer generischen Ausnahme und einer bestimmten Ausnahme (z. B. IOException?)

7

Momentan erfasse ich nur generische Ausnahmen, aber ich möchte dies ändern, um die spezifischen Ausnahmen zu erfassen, aber was ist der Vorteil davon?

    
Renato Dinhani 12.05.2011, 14:25
quelle

7 Antworten

13

Der Unterschied zwischen dem Ausführen einer allgemeinen try / catch-Anweisung und dem Abfangen einer bestimmten Ausnahme (z. B. einer FileNotFoundException) hängt normalerweise davon ab, welche Fehler Sie behandeln müssen und bei welchen Fehlern Sie sich keine Sorgen machen müssen. Zum Beispiel:

%Vor%

Der obige Code wird jede Ausnahme fangen, die innerhalb der try-Anweisung ausgelöst wird. Aber vielleicht möchten Sie nicht jeden Fehler behandeln. Was können Sie mit einer Ausnahme "OutOfMemory" tun?

Eine bessere Methode zur Fehlerbehandlung wäre es, eine Standardaktion auszuführen, wenn der Fehler unbekannt ist oder etwas, wozu Sie nichts tun können, und eine weitere Aktion auszuführen, wenn Sie feststellen, dass Sie "Plan B" ausführen können.

Nehmen Sie beispielsweise an, dass Sie versuchen, eine Datei zu öffnen, die Datei jedoch nicht existiert. Sie können die FileNotFoundException abfangen und eine neue leere Datei wie folgt erstellen:

%Vor%

Dies war die effektivste und benutzerfreundlichste Methode zur Fehlerprüfung, die ich in der Vergangenheit verwendet habe.

    
Kyle 12.05.2011, 14:40
quelle
3

Durch das Abfangen bestimmter Ausnahmen können Sie spezifische Antworten auf jeden Fall anpassen.

Auf einer logischen Ebene ist eine Reihe von catch-Blöcken mit einem catch-Block identisch und schreibt dann Ihre eigene bedingte Logik in den einzelnen catch-Block. Beachten Sie, dass die bedingte Logik die Ausnahme auch als spezifische Subtypen darstellen muss, wenn Sie auf detaillierte Informationen zugreifen möchten, die innerhalb des Subtyps deklariert sind.

Die wenigen Nachteile, jede Ausnahme separat zu erfassen, schließen die gesamte try - catch - Struktur ein, die sehr groß wird und die Logik der enthaltenden Methode härter macht und den Code in vielen oder allen separaten catch - Blöcken wiederholt (z. B. Protokollierung der Ausnahme).

In einigen Fällen gewährleistet die Komplexität einer zugrunde liegenden API sowohl die Behandlung aller verschiedenen Ausnahmen als auch die Extraktion der try-catch-Struktur in eine Utility-Methode. Zum Beispiel scheint der Methodenaufruf durch Reflektion regelmäßig die Verwendung von Fassaden-APIs zu rechtfertigen.

Auf API-Design-Ebene gibt es immer einen Balanceakt zwischen

  • Eine sehr umfangreiche (öffentliche) Ausnahmehierarchie
  • Einbeziehen von Fehlercodes als Teil der Informationen in einer Basisausnahme und
  • Ein öffentlicher Satz von Marker-Interfaces und die Verwendung von privaten Exception-Subtypes
Dilum Ranatunga 12.05.2011 14:27
quelle
2

Ein gutes Beispiel, das zeigt, wie Probleme basierend auf dem Typ des aufgetretenen Problems behandelt werden können:

%Vor%

während das entsprechende:

%Vor%

Das letzte Beispiel bietet keine Möglichkeit, die Ausnahme basierend auf dem aufgetretenen Problem zu behandeln. Alle Probleme werden auf die gleiche Weise behandelt.

    
Edwin Buck 12.05.2011 14:33
quelle
1

Wenn Sie einen Code-Block haben, der verschiedene Ausnahmen auslösen kann, und Sie diesen mit einem allgemeinen try {} catch {Exception e} umgeben, werden Sie nicht wissen, was genau passiert ist und wie Sie den Fehler behandeln sollten.

    
abalogh 12.05.2011 14:27
quelle
1

Wenn Sie planen, dass mehrere Personen Ihre Anwendung verwenden, können Sie mit bestimmten Ausnahmen genau wissen, wo Ihr Programm fehlgeschlagen ist, wenn es von jemand anderem kontrolliert wurde. Aber abgesehen davon, wenn das Programm nur für Sie selbst ist, können Sie es einfach durch einen Debugger ausführen, obwohl die Angewohnheit, eine sehr anschauliche und unzweideutige Fehlerbehandlung zu machen, ein großer Erfolg ist, wenn Sie jemals planen, Ihre zu nehmen Programmierung für die Massen:)

    
Richard Smith 12.05.2011 14:32
quelle
1

Nehmen Sie dieses Beispiel:

%Vor%

Wie es aussieht, funktioniert es ... normalerweise. Mit dem vagen Fehlerfang kann ich jedoch nicht wirklich etwas tun, außer den Benutzer zu warnen. Wenn ich das FileNotFoundException speziell abgefangen habe, könnte ich eine andere Datei versuchen. Wenn ich die IOException spezifisch erwische, könnte ich vor etwas anderem warnen. Dieses Beispiel ist ein wenig schwach, aber es kann Ihnen eine Idee geben.

    
josh.trow 12.05.2011 14:33
quelle
1

Das Problem beim Abfangen generischer Ausnahmen besteht darin, dass Sie eine unerwartete Ausnahme abfangen (und häufig falsch behandeln). Zum Beispiel:

%Vor%

Wie Sie sehen können, wird das oben Gesagte unter der Annahme geschrieben, dass der Code in try nur dann fehlschlagen kann, wenn die Datei fehlt oder aus irgendeinem Grund nicht geöffnet werden kann. Wenn die Methode mit einer null -Datei aufgerufen wird oder wenn ein Fehler im Code vorhanden ist, der die Datei liest, sind NPEs und andere ungeprüfte Ausnahmen möglich. Daher wird der Code Fehler verstecken, indem er Exception abfängt.

Die korrekte Version des obigen Codes würde IOException (oder vielleicht FileNotFoundException ) abfangen und die unerwarteten Ausnahmen propagieren lassen.

    
Stephen C 12.05.2011 14:33
quelle

Tags und Links