Vraag Afdrukken Exception vs Exception.getMessage


Bestaan ​​er goede voorbeelden voor het gebruik van de volgende twee stukjes code met betrekking tot uitzonderingen.

//code1

} catch (SomeException e) {
    logger.error("Noinstance available!", e.getMessage());
}

//code2
} catch (SomeException e) {
    logger.error("Noinstance available!", e);
}

Wanneer moet ik de methode getMessage van een uitzondering gebruiken?


15
2017-09-29 09:25


oorsprong


antwoorden:


De eerste compileert niet omdat de methode error accepteer a String als eerste parameter en a Throwable als tweede parameter.

e.getMessage() is geen Throwable.

De code zou moeten zijn

} catch (SomeException e) {
    // No stack trace
    logger.error("Noinstance available! " + e.getMessage());
}

Vergeleken met

} catch (SomeException e) {
    // Prints message and stack trace
    logger.error("Noinstance available!", e);
}

De eerste print alleen een bericht. De tweede print ook het hele stacktracé.

Het hangt van de context af of het nodig is om de stacktracering af te drukken of niet.

Als u al weet waarom een ​​uitzondering kan worden gegenereerd, is het geen goed idee om het volledige stacktracé af te drukken.

Als u het niet weet, kunt u het beste strack-trace afdrukken om de fout gemakkelijk te vinden.


13
2017-09-29 09:28



Dit prototype is handig, wanneer u exception in class classificeert Bedrijfsniveau en Technische uitzondering.

Voor uitzondering op bedrijfsniveau, gebruikt u gewoon het bericht, door u aan te melden voor analytics of kan zijn om op het scherm een ​​betekenisinformatie weer te geven (iets werkte niet).

Voor technische uitzondering is het beter om de fout met stacktrace te loggen, om het probleem op te sporen en het is eenvoudig om fouten op te sporen en op te lossen.


2
2017-09-29 09:32



Het hangt er van af of je stacktrack van originele uitzondering (SomeException) nodig hebt. Zo ja, dan is code2 hier de juiste optie. Let op: dit is een meer algemene manier om met deze situaties om te gaan.

Als u niet geïnteresseerd bent in wat de oorspronkelijke uitzondering was, kunt u code1 gebruiken, maar deze is niet correct. Omdat de code die u hebt verzonden bericht als argument gebruikt. Dus de juiste manier is:

logger.error("Noinstance available! - reason:" + e.getMessage());

1
2017-09-29 09:29



Met stacktrace:

logger.error("Could not do XYZ because of: " + ex, ex);

Zonder stacktrace:

logger.error("Could not do XYZ because of: " + ex);

1
2017-09-29 09:32



Exception.printStackTrace() mag niet worden gebruikt tenzij u bijvoorbeeld debugging uitvoert.

Voor het loggen, is het absoluut beter om te gebruiken Exception.getMessage(). Merk ook op dat veel logging frameworks (bijvoorbeeld Log4j) exception it self accepteren als argument voor de logging-methode (bijvoorbeeld error()) en werkt het zelf uit.


0
2017-09-29 09:29



U kunt dit proberen: -

logger.error(e.getMessage(), e);

Het Retourneert de gedetailleerde berichtreeks van deze throwable.

logger.error(e.getLocalizedMessage(),e);

Creëert een gelokaliseerde beschrijving van deze throwable. Subklassen kunnen deze methode overschrijven om een ​​locale-specifiek bericht te produceren. Voor subklassen die deze methode niet overschrijven, retourneert de standaardimplementatie hetzelfde resultaat als getMessage ().

In jouw geval is e niets dan het uitzonderingsobject ...

getLocalizedMessage () u moet overschrijven en uw eigen bericht geven, dit is de betekenis voor gelokaliseerd bericht.


0
2017-09-29 10:19