10
votes

Les traces de pile sont-elles générées lorsqu'une exception Java est lancée?

Cela suppose que nous n'appelons pas la méthode .PrintStackTrace - juste lancer et attraper.

Nous envisageons cela pour certains goulots d'étranglement de la performance.


1 commentaires

Si vous voulez une préformation, vous ne devriez vraiment pas vous lancer une exception, cela ne devrait être que pour des cas exceptionnels qui n'ont pas d'impact sur votre performance. Peut-être que vous pouvez faire ce que vous essayez sans une exception?


6 Réponses :


15
votes

Non, des traces de pile sont générées lorsque l'objet d'exception est construit, pas quand il est lancé. Les constructeurs lanceurs () appellent FillinsChase (). (Au moins dans le JDK 6 de Sun / Oracle pour Windows.)


3 commentaires

En outre, si vous vous souciez de la performance, vous pouvez remplacer FillinStackTrace () pour ne rien faire


Il y a une différence entre lancer une exception et en construction.


Vous êtes absolument correct, Andy. Je n'ai pas lu la question avec précaution suffisamment.



9
votes

StackTrace est capturé lorsque l'exception est construite.

Si vous ne vous souciez vraiment pas de StackTrace, vous pouvez construire une exception une fois et la jeter plusieurs fois, mais cela ressemble à un piratage et peut être déroutant.


0 commentaires

4
votes

Un objet lancé capture la pile actuelle (à l'aide du code natif) si elle sera imprimée ou non. C'est la raison pour laquelle les exceptions ne devraient pas être (ab) utilisées pour le flux de contrôle.


0 commentaires

3
votes

Il n'est pas construit paresseusement lorsque la méthode PrintStackTrace () est appelée

GRAFTER NEAL (ancien ingénieur SUN de l'équipe qui construit Java) mentionné Performances d'exception mentionnées ici :

la partie la plus chère de l'exception La manipulation de loin consiste à capturer la pile Tracez lors de la création de l'exception

Aussi, voir Cette question .


1 commentaires

Les exceptions coûtent beaucoup parce que chaque fois qu'une exception est lancée, la trace de la pile doit être créée et peuplée. Imaginez une opération de transfert de solde qui échoue dans 1% des cas dus au manque de fonds. Même avec ce faible taux de défaillances relativement peu, les performances peuvent être gravement touchées. Voir les résultats du code source et de référence ici: JQuantLib.org/index.php/cost_of_exceptions_in_java



0
votes

fyi. Vous pouvez surcharger FillinStackTrace pour éviter la pénalité de performance. Nous faisons cela à Twitter lorsque nous voulons de certaines exceptions où nous ne nous soucions pas d'une trace de pile.

Cray-Framework est également en jeu 1.3.x ligne.

En outre, vous pouvez cassez FillInstackTrace pour le voir se fait à la construction.


0 commentaires

1
votes

Comme répondu ci-dessus, les traces de pile ne sont pas générées lorsqu'une exception est lancée. Ils sont plutôt générés lorsque l'exception est construite. Je l'ai testé ci-dessous. À mon avis, ce n'est pas intuitif. L'endroit où quelque chose qui ne va pas est l'endroit où l'exception est jetée, pas où elle est construite.

Exception in thread "main" java.lang.RuntimeException: Hello
    at FSystem.experimental.exceptions.ExceptionNewVsThrow.instantiateException(ExceptionNewVsThrow.java:18)
    at FSystem.experimental.exceptions.ExceptionNewVsThrow.main(ExceptionNewVsThrow.java:26)


0 commentaires