Est-ce une bonne pratique d'utiliser NoStackTrace dans scala?

11

Je suis tombé sur le NoStackTracemixin pour Exceptions in scala.

Est-ce une bonne pratique de l'utiliser, ou doit-il être considéré comme "interne" à la scala et laissé seul?

Daenyth
la source

Réponses:

14

Pendant un instant, passons à Stack Overflow - Quelle est la lenteur des exceptions Java?

Il s'avère que la partie coûteuse du lancement d'exceptions est la population de la trace de pile qui va de pair avec l'exception.

Cette trace de pile est très utile lors du débogage de problèmes pour essayer de comprendre d'où les choses sont appelées. L'une des questions standard posées sur les problèmes est "quel est le code" et "quelle est la trace de la pile". Sans ces deux choses, diagnostiquer un problème est presque impossible.

Cependant, toutes les exceptions ne sont pas générées par des problèmes . Certains d'entre eux, vous vous y attendez presque.

Considérez le cas où vous avez une chaîne provenant d'une source et que vous souhaitez la récupérer dans un format entier avec Integer.decode .

Integer foo = Integer.decode(str);

Mais cela decodejette un check NumberFormatException. D'accord...

Integer foo;
try {
    foo = Integer.decode(str);
} catch (NumberFromatException e) {
    // raise an error back to the input form
}

Mais vous ne vous souciez vraiment pas de la trace de la pile là-bas ... mais c'est là. Et juste un peu plus lentement car il remplissait la trace de la pile.

Ainsi, à Scala, vous avez NoStackTrace:

Un trait pour les exceptions qui, pour des raisons d'efficacité, ne remplissent pas la trace de la pile. La suppression de trace de pile peut être désactivée sur une base globale via un wrapper de propriété système dans scala.sys.SystemProperties.

Ne remplissez pas ce dont vous n'avez pas besoin. Vous ne vous souciez pas de la trace de la pile, car vous la gérez immédiatement. Ce n'est pas quelque chose qui se fait passer, et ce n'est pas tout à fait exceptionnel non plus.

Ce n'est pas une mauvaise pratique de l'utiliser lorsque vous savez ce que vous manipulez. Mais, si vous transmettez cela dans la chaîne - ne l'utilisez pas - vous devrez peut-être simplement vous connecter d'où provient une exception.

Communauté
la source