Wie kann ich alle Ausnahmen erfassen, die beim Lesen und Schreiben einer Datei auftreten?

103

Gibt es in Java eine Möglichkeit, alle zu erhalten (zu fangen), exceptionsanstatt die Ausnahme einzeln zu fangen?

Johanna
quelle
2
und ich werde all diese spezifischen Ausnahmen mit catch (Ausnahme e) {} ??
Johanna
Ja. Da Exception die Basisklasse aller Ausnahmen ist, werden alle Ausnahmen abgefangen.
jjnguy
1
@ jjnguy: danke für deine gute erklärung.
Johanna
Ich bin froh, dass es hilfreich war.
jjnguy

Antworten:

110

Wenn Sie möchten, können Sie Ihren Methoden Throws-Klauseln hinzufügen. Dann müssen Sie die überprüften Methoden nicht sofort abfangen. Auf diese Weise können Sie die exceptionsspäteren (möglicherweise gleichzeitig mit anderen exceptions) fangen .

Der Code sieht aus wie:

public void someMethode() throws SomeCheckedException {

    //  code

}

Dann können Sie später mit dem umgehen, exceptionswenn Sie mit ihnen in dieser Methode nicht umgehen wollen.

Um alle Ausnahmen abzufangen, kann ein Codeblock Folgendes auslösen: (Dies fängt auch ab, was ExceptionsSie selbst geschrieben haben.)

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

Der Grund dafür ist, dass Exceptiondie Basisklasse für alle Ausnahmen ist. Daher ist jede Ausnahme, die ausgelöst werden kann, ein Exception(Großbuchstabe 'E').

Wenn Sie Ihre eigenen Ausnahmen behandeln möchten, fügen Sie einfach einen catchBlock vor der generischen Ausnahme hinzu.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}
jjnguy
quelle
94

Ich bin damit einverstanden, dass es kein guter Stil ist, eine rohe Ausnahme abzufangen, aber es gibt Möglichkeiten, Ausnahmen zu behandeln, die eine überlegene Protokollierung und die Fähigkeit bieten, mit dem Unerwarteten umzugehen. Da Sie sich in einem außergewöhnlichen Zustand befinden, sind Sie wahrscheinlich mehr daran interessiert, gute Informationen zu erhalten als an der Reaktionszeit. Daher sollte die Leistung nicht zu einem großen Erfolg werden.

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

Dies berücksichtigt jedoch nicht die Tatsache, dass IO auch Fehler auslösen kann. Fehler sind keine Ausnahmen. Fehler unterliegen einer anderen Vererbungshierarchie als Ausnahmen, obwohl beide die Basisklasse Throwable gemeinsam nutzen. Da IO Fehler auslösen kann, möchten Sie möglicherweise so weit gehen, Throwable zu fangen

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}
codethulhu
quelle
12
Warum nicht mehrere Fangblöcke verwenden?
Carl G
1
Ich würde argumentieren, dass Sie jede Ausnahme explizit abfangen sollten, aber die Frage fragte explizit, wie man alles abfängt, was ein Codeblock auslösen würde.
Codethulhu
Dieser Wurf war nützlich.
Anshul
Dies ist die Lösung, nach der ich gesucht habe. Ich brauchte ein if else für die Ausnahmebehandlung. Danke
CubeJockey
Wurfspitze ist wirklich nützlich.
Cherryhitech
15

Fangen Sie die Basisausnahme 'Ausnahme' ab

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }
Allan
quelle
8
Wenn Sie diesen Code schreiben, machen Sie mit ziemlicher Sicherheit etwas Schreckliches falsch.
George
2
@ George Warum hast du das gesagt?
Kuchi
10
@George Nicht unbedingt, wenn Sie sich mit etwas befassen, das viele sensible Eingabeparameter enthält und es sehr kompliziert ist, die Gültigkeit jedes einzelnen zu überprüfen, ist es der richtige Weg, alle Arten von Ausnahmen zu erfassen, sobald die Arbeitsfälle ordnungsgemäß getestet wurden . Dadurch wird der Code klarer und weniger bedenklich als ein riesiger und möglicherweise schwerer Zustand.
Johnride
2
Die meisten Codierer, mit denen ich gearbeitet habe, haben nichts in ihre catch-Anweisungen eingefügt. Daher ist die Verwendung dieses try catch-Snippets tatsächlich besser, als eine Reihe verschiedener Ausnahmetypen abzufangen und nichts damit zu tun
Lou Morda,
1
@ LouisMorda Ich bin anderer Meinung, es ist schlimmer, jede Ausnahme-Unterklasse abzufangen und nichts basierend auf ihnen zu tun (sie zu ignorieren), als nur einige bestimmte Ausnahmen abzufangen und sie zu ignorieren. Wenn Sie einige Ausnahmetypen abfangen und nichts mit den Informationen anfangen, haben Sie keine Chance zu wissen, was in diesen Situationen schief gelaufen ist. Wenn Sie jedoch alle Ausnahmeunterklassen abfangen, haben Sie keine Chance zu wissen, was in einer großen Anzahl schief gelaufen ist von Situationen. Überlegen Sie, wie Sie mit Fehlerberichten ohne die Informationen aus den Ausnahmen wie Stacktraces und Nachrichten umgehen würden.
Zpon
6

Es ist eine schlechte Praxis, eine Ausnahme abzufangen - sie ist einfach zu weit gefasst , und Sie verpassen möglicherweise so etwas wie eine NullPointerException in Ihrem eigenen Code.

Bei den meisten Dateivorgängen ist IOException die Stammausnahme . Besser, das stattdessen zu fangen.

Alex Feinman
quelle
1
Es ist eine schlechte Praxis, eine Ausnahme zu erwischen. Warum? Downvote schlecht erklärt
Pedro Sequeira
4

Ja da ist.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}
CodeFusionMobile
quelle
4

Sie können mehrere Ausnahmen in einem einzelnen Fangblock abfangen.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 
Rathishkumar Nair
quelle
3

Wollen Sie damit sagen Fang ein Exceptionjeglicher Art , die ausgelöst wird, im Gegensatz zu nur bestimmte Ausnahmen?

Wenn ja:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}
JoshJordan
quelle
Was soll ich für diejenigen tun, die nicht spezifisch sind?
Johanna
und ich werde all diese spezifischen Ausnahmen mit catch (Ausnahme e) {} ??
Johanna