Scala: Silencieusement attraper toutes les exceptions
Vide bloc catch semble invalide en Scala
try {
func()
} catch {
} //error: illegal start of simple expression
Comment je peux attraper toutes les exceptions sans leur traitement?
Silencieusement à avaler des exceptions est une mauvaise idée - quand quelque chose va mal, vous ne le saurez jamais. Au moins, journal de l'exception.
Parfois, vous ne voulez vraiment pas savoir. Et vous ne voulez pas que votre patron savoir.
Parfois, vous ne voulez vraiment pas savoir. Et vous ne voulez pas que votre patron savoir.
OriginalL'auteur tmporaries | 2014-01-16
Vous devez vous connecter pour publier un commentaire.
Quelques exceptions ne sont pas vraiment destinés à être pris. Vous pouvez le demander quand même:
mais c'est peut-être pas si sûr.
Tous les exceptions sont appariés par
scala.util.control.NonFatal
, de sorte que vous pouvez:pour un peu moins risqué, mais encore très utile attraper.
Ou
scala.util.Try
peut le faire pour vous:et vous pouvez en correspondance du modèle sur le résultat si vous voulez savoir ce qui s'est passé. (
Try
ne fonctionne pas si bien quand vous voulez unfinally
bloc, cependant.)+1 à tous les commentaires sur de ne pas faire cela pour TOUS
Throwable
instances. Ignorant une partie de la JVM des erreurs, par exemple,OutOfMemoryError
, peut laisser la machine dans un état incohérent conduisant à des bogues qui sont extrêmement difficiles à diagnostiquer et ont le potentiel de causer le silence de la corruption des données (selon le programme).la raison n'est pas seulement de la JVM des exceptions, comme OOM ou quelque chose comme ça, le problème, c'est qu'il existe un ensemble de exceptions scala est l'aide pour le contrôle de flux.
Voulez-vous dire
catch { case NonFatal(t) => }
au lieu de cela, avec l'extracase
?Oui, merci. Fixe.
OriginalL'auteur Rex Kerr
Dans
si l'essai est réussi, vous obtiendrez un
Some(value)
, s'il échoue uneNone
.OriginalL'auteur elm
Essayez d'ajouter
dans votre bloc catch 🙂
OriginalL'auteur Tamere
À l'intérieur de la Scala du bloc catch, vous devez utiliser la même construction que dans un match de déclaration:
case _ : Throwable
pour effacer l'avertissement. Quand j'ajoutecase _ : Throwable
au lieu de cela, il ne compile pas: erreur: '=> " attendu, mais '}' n'a été trouvéVous avez besoin de la flèche. Vous devriez écrire
case _: Throwable =>
d'exprimer que vous ne pouvez pas le faire par accident.Merci, vous avez raison. Mise à jour de réponse avec Throwable.
OriginalL'auteur Akos Krivachy
Si l'annotation avec Throwable est un fardeau, vous pouvez également
qui a le petit virtuel de l'auto-documentation.
OriginalL'auteur som-snytt
Juste pour un souci d'exhaustivité, il y a un ensemble de méthodes intégrées dans d'Exception, y compris en silence d'intercepter les exceptions. Voir Utilisation de scala.util.de contrôle.Exception pour plus de détails sur l'utilisation.
OriginalL'auteur om-nom-nom
J'ai comme l'une des suggestions ici pour utiliser
Try()
avectoOption
, mais dans le cas où vous ne voulez pas aller plus loin avec l'Option, il vous suffit de faire:OriginalL'auteur Stas
Ce sujet:
Il génère une Option comme dans les réponses précédentes.
OriginalL'auteur leo9r