Niet te vangen uitzonderingen als u niet van plan om ze te behandelen

De 10 nov 2008

Het is een slecht idee om een applicatie met exception handling hebben als:

  catch (SQLException sqlexception)
 (
 / / Dit is niet de bedoeling dat gebeuren
 ) 

Dit is niet de bedoeling dat gebeuren?!
Serieus?

We weten allemaal dat geen uitzonderingen verondersteld worden te gebeuren. Toch kunnen we ze zo te vangen dat als ze gebeuren, kunnen we stappen ondernemen om schade te voorkomen extra.

Het is goed om uitzonderingen te behandelen en geef zinvolle boodschappen naar de gebruiker. Tegelijkertijd, vermijd het gebruik van zinnen als "Er is een fout opgetreden 'in berichten. Vertel welke fout precies heeft plaatsgevonden, en suggereren een aantal stappen om het probleem op te lossen. Probeer het verzenden van de stack trace wat log-bestand, zodat iemand kan goed begrijpen waar en waarom het fout is opgetreden.

Exception handling is niet de kunst van het verbergen van elke fout van de gebruiker en te doen alsof als geen fout is opgetreden.

6 reacties tot dusver

  • Botero-Alexander Lowry zegt:

    Dit is de reden waarom gecontroleerd uitzonderingen zijn zo'n slecht idee. In plaats van het uitdragen en uitzonderingen op te vallen, Java benadrukt ze te verbergen voor de ontwikkeling te vergemakkelijken. Uitzonderingen breken van je app is beter dan niet-afgehandelde uitzonderingen gaan omdat je het gewoon nodig om de code eruit te komen.

  • Marko Simovic zegt:

    Er lijkt een cultuur, waar foutafhandeling wordt gedacht dat zij vreemde, dat stations dit soort praktijken. Wat de meeste ontwikkelaars nodig hebben om te begrijpen is dat de afhandeling van fouten zal altijd onderdeel van een programma, en een groot deel op dat (40-50% zou ik zeggen).

    In het algemeen Ik ben een beetje gemengde gecontroleerd over uitzonderingen, maar ik geloof nog steeds gaat het terug naar de cultuur probleem. Java dwingt de behandeling, maar het is nog steeds aan de ontwikkelaar om iets zinvols te doen met die catch-blokken.

  • SJS zegt:

    Het probleem is niet met uitzonderingen, het is met "dit kan niet gebeuren dus who cares" type denken. Het toont in if-else-if constructies en schakelaars ook.

    schakelaar (foo) (
    Bij BAR: stuur () break;
    Bij BAZ: handleBaz () break;
    ...
    default: / * niet kan gebeuren * /
    )

    Er zijn momenten waarop men niet * zorg * als sommige code gooit een uitzondering, maar dit is normaal gesproken een klein, klein fractie van de tijd. Het advies om af te drukken van de stack naar een logbestand (of zelfs stderr) Trace is een uitstekend beleid.

    De rest van de tijd, we vermoedelijk zorg, maar ofwel weet niet wat te doen over een uitzondering, of onze API niet mogelijk is om gecontroleerd uitzonderingen. Wrapping dat gecontroleerd uitzondering is beter dan negeren:

    try (
    someObject.mightThrowCheckedException ();
    ) Catch (SomeCheckedException SCX) (
    werpen een nieuw RuntimeException (SCX);
    )

    En als het echt een "niet kunnen gebeuren", waarom er een fout wordt opgeroepen voor:

    try (
    someObject.saysItThrowsCheckedExceptionButItLies ();
    ) Catch (LyingCheckedException LCX) (
    Internalerror ie = nieuwe Internalerror (
    "Programmer Assumptie Overtreding");
    ie.initCause (LCX);
    gooi dat wil zeggen;
    )

    Of beter nog:

    public class PAVError breidt Internalerror (
    openbare PAVError (Throwable t) (
    super ("Programmer Hemelvaart Overtreding");
    initCause (t);
    )
    ...
    )

    Het zou mooi zijn als het verschil tussen een gecontroleerd en een ongecontroleerde uitzondering zijn in de wijze waarop de uitzondering is gegooid, in plaats van de stamvader van de uitzondering.

  • AJ zegt:

    mijn team te leiden en negeert de vangsten altijd uitzonderingen ... maakt niet uit wat ... als hij het doet

    Proberen
    (
    ...
    ...
    )
    Catch (Exception ex)
    (
    / / Leeg
    )

    de reden dat hij geeft is dat het behalve wanneer hij negeert wat debuggen in runtime shows. Dit is lamest van alle excuses om uitzonderingen negeer ik ooit heb gehoord.

  • ob zegt:

    Yep. Gecontroleerd Uitzonderingen zijn een grap, uitgevonden in een kortzichtige wereld waar er wouldnt zijn enorm gelaagd apps.

    In uw app API ALTIJD gecontroleerd wrap uitzonderingen RuntimeExceptions, en zorg ervoor dat de "top level" uitzondering "handler logs en kan de oorspronkelijke uitzondering in ruil zijn, getCause () methode.

    Het inslikken van uitzonderingen is zeker een kip shit reactie niet wist hoe ze te gooien hoger, en gaan met hen op het niveau van de gebruiker.

  • Veera zegt:

    Exception handling is niet de kunst van het verbergen van elke fout van de gebruiker en te doen alsof als geen fout is opgetreden.

    - Goed gezegd. Een goed gedefinieerd exception handling mechanisme is een must voor elke softwaretoepassing.

Laat een reactie achter