Wie kann ich alle Ausnahmen abfangen, die beim Lesen / Schreiben einer Datei ausgelöst werden?

Lesezeit: 5 Minuten

Benutzeravatar von Johanna
Johanna

Gibt es in Java eine Möglichkeit, alles zu bekommen (fangen). exceptions anstatt die Ausnahmen einzeln abzufangen?

  • und ich werde all diese spezifischen Ausnahmen mit catch(Exception e){}??

    – Johanna

    2. Juli 2009 um 18:21 Uhr

  • Ja. Da Exception die Basisklasse aller Ausnahmen ist, fängt sie jede Ausnahme ab.

    – jjnguy

    2. Juli 2009 um 18:23 Uhr

Benutzeravatar von jjnguy
jjnguy

Wenn Sie möchten, können Sie Ihren Methoden throws-Klauseln hinzufügen. Dann müssen Sie nicht gleich geprüfte Methoden abfangen. Auf diese Weise können Sie die fangen exceptions später (vielleicht gleichzeitig mit anderen exceptions).

Der Code sieht so aus:

public void someMethode() throws SomeCheckedException {

    //  code

}

Dann können Sie sich später damit befassen exceptions wenn Sie nicht auf diese Weise mit ihnen umgehen wollen.

Um alle Ausnahmen abzufangen, die ein Codeblock auslösen kann, können Sie Folgendes tun: (Dies wird auch abfangen Exceptions du hast selbst geschrieben)

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, der funktioniert, ist, weil Exception ist die Basisklasse für alle Ausnahmen. Daher ist jede Ausnahme, die ausgelöst werden kann, eine Exception (Großbuchstabe „E“).

Wenn Sie zuerst Ihre eigenen Ausnahmen behandeln möchten, fügen Sie einfach a hinzu catch Block vor der generischen Ausnahme.

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

Ich stimme zwar zu, dass es kein guter Stil ist, eine rohe Ausnahme abzufangen, aber es gibt Möglichkeiten, Ausnahmen zu behandeln, die eine überlegene Protokollierung und die Möglichkeit 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 Instanz der Leistung kein großer Hit sein.

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 werfen kann. Fehler sind keine Ausnahmen. Fehler befinden sich in einer anderen Vererbungshierarchie als Ausnahmen, obwohl beide die Basisklasse Throwable teilen. Da IO Fehler werfen kann, möchten Sie vielleicht 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;
    }
}

  • Ich würde argumentieren, dass Sie jede Ausnahme explizit abfangen sollten, aber in der Frage wurde explizit gefragt, wie Sie alles abfangen können, was ein Codeblock auslösen würde.

    – codethulhu

    17. Februar 2014 um 16:15 Uhr

  • Dieser Wurf war nützlich.

    – Anshul

    21. Mai 2014 um 7:21 Uhr

  • Dies ist die Lösung, nach der ich gesucht habe, ich brauchte ein if else für die Ausnahmebehandlung. Danke

    – Würfeljockey

    23. Juli 2015 um 14:49 Uhr

  • Wurfspitze ist wirklich nützlich.

    – Cherryhitech

    16. Juni 2017 um 20:51 Uhr

  • Wenn Sie Throwables abfangen, sollten Sie bedenken, dass die VirtualMachineErrors wie StackOverflowError oder OutOfMemoryError nicht viel mehr als das Protokollieren ermöglichen. Sie liegen außerhalb der Anwendungssteuerung und Sie können sie nicht handhaben.

    – Daz

    16. April 2019 um 5:28 Uhr

Fangen Sie die Basisausnahme ‘Exception’ ab

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

  • Wenn Sie diesen Code schreiben, machen Sie mit ziemlicher Sicherheit etwas schrecklich falsch.

    – George

    2. Mai 2013 um 3:40 Uhr

  • @Georg Warum hast du das gesagt?

    – kuchi

    20. Juni 2013 um 17:24 Uhr

  • @George Nicht unbedingt, wenn Sie mit etwas zu tun haben, das viele sensible Eingabeparameter hat und es sehr kompliziert ist, die Gültigkeit jedes einzelnen von ihnen zu überprüfen, ist es der richtige Weg, alle Arten von Ausnahmen abzufangen, sobald die Arbeitsfälle ordnungsgemäß getestet wurden . Es macht den Code klar und viel weniger Mindf*k als eine riesige und potenziell schwere Bedingung.

    – Johnride

    15. November 2013 um 18:53 Uhr

  • Die meisten Programmierer, 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 einen Haufen verschiedener Ausnahmetypen abzufangen und nichts damit zu tun

    – Lou Morda

    6. April 2015 um 23:56 Uhr


  • @LouisMorda Ich bin anderer Meinung, es ist schlimmer, jede Exception-Unterklasse abzufangen und nichts darauf basierend zu tun (sie zu ignorieren), als nur einige spezifische Ausnahmen abzufangen und sie zu ignorieren. Wenn Sie einige Exception-Typen abfangen und nichts mit den Informationen tun, haben Sie keine Chance zu wissen, was in diesen Situationen schief gelaufen ist, aber wenn Sie alle Exception-Unterklassen abfangen, haben Sie keine Chance zu wissen, was bei einer großen Anzahl schief gelaufen ist von Situationen. Überlegen Sie, wie Sie Fehlerberichte ohne die Informationen aus den Ausnahmen wie Stacktraces und Meldungen handhaben würden.

    – zpon

    29. Juli 2015 um 12:29 Uhr

Sie können mehrere Ausnahmen in einem einzigen Catch-Block abfangen.

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

Es ist schlechte Angewohnheit zu fangen Ausnahme — es ist einfach zu breit, und Sie könnten etwas wie a übersehen NullPointerException in Ihrem eigenen Code.

Für die meisten Dateioperationen IOException ist die Root-Ausnahme. Besser, das stattdessen zu fangen.

  • Es ist keine gute Praxis, Exception abzufangen. Warum? downvote schlecht erklärt

    – Pedro Sequeira

    22. März 2018 um 17:38 Uhr

Benutzeravatar von Marv
Marv

Meinst du Fang an Exception von irgendwelchen Typ das geworfen wird, im Gegensatz zu nur bestimmten Ausnahmen?

Wenn ja:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

  • Es ist keine gute Praxis, Exception abzufangen. Warum? downvote schlecht erklärt

    – Pedro Sequeira

    22. März 2018 um 17:38 Uhr

Benutzeravatar von CodeFusionMobile
CodeFusionMobile

Ja da ist.

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

1449970cookie-checkWie kann ich alle Ausnahmen abfangen, die beim Lesen / Schreiben einer Datei ausgelöst werden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy