La différence entre les Mortels, et à l'Exception de Scala
Dans cet article, il est dit que:
Si vous voulez attraper “tout” qui devrait normalement se produire, puis utilisez
Non mortels:
import scala.util.control.NonFatal
try {
operation()
} catch {
case NonFatal(e) => errorHandler(e)
}
Mais j'ai l'habitude d'utiliser Exception
:
try {
operation()
} catch {
case e: Exception => errorHandler(e)
}
Je voudrais savoir quelle est la différence entre NonFatal
et Exception
en Scala? Ne Exception
en Scala inclure exception irrécupérable?
Autant que je sache, en java, Exception
est pour erreur non fatale et Error
est pour erreur fatale. Est scala différents avec java en terme de Exception
?
Lequel est le bon pour attraper les non-fatal exception?
Vous devez vous connecter pour publier un commentaire.
Edit: mis à jour pour la dernière version Scala (2.11+ a une définition différente de
NonFatal.apply
).NonFatal
est juste une pratique de l'extracteur qui est défini dansscala.util.control
:Il n'y a pas "mortel" genre " des exceptions à la JVM -
Error
s ne sont pas toujours "fatal", ils sont juste un type spécial de l'intérieur des exceptions. "Fatal" exceptions sont tout simplement une liste d'exceptions utilisé dansNonFatal
définition. Dans cette terminologie tous lesException
s, saufInterruptedException
sont considérés comme non-mortelles. Il est logique d'envisagerInterruptedException
fatale, car cela signifie que le thread est interrompu, si vous souhaitez gérer, il faut le faire explicitement.NonFatal
extracteur gère égalementControlThrowable
s correctement. Ce sont des exceptions qui sont levées par le contrôle spécial de la fonction de transfert commebreak
à l'intérieur debreakable
.NonFatal
etException
est à peu près la même?e: Exception
vous inspectez le type réel de l'exception, à l'instar decatch (Exception e)
en Java. Si l'exception est une sous-classe deException
, l'exception sera pris.NonFatal
, d'autre part, est un extracteur d'objet qui effectue une logique supplémentaire sur le contenu de la valeur. Dans ce casNonFatal(e)
sera match (et attraper l'exception) que lors de laNonFatal.apply(e)
retournetrue
. Quand il revienttrue
vous pouvez le voir dans le morceau de code ci-dessus.case e: Exception
comprendrait égalementVirtualMachineError, ThreadDeath, LinkageError, ControlThrowable, NotImplementedError
? Avez-vous suggérons également decase NonFatal(e)
doit être utilisé au lieu decase e: Exception
dans la plupart des cas?case e: Exception
ne comprend pas lesVirtualMachineError
et car ceux sontError
s, pasException
s. Et oui, je vous suggère d'utiliserNonFatal
car c'est plus pratique dans la plupart des cas (en raison de la bonne manipulation desInterruptedException
ouControlThrowable
, par exemple).InterruptedException
allait se produire? Pour le code à l'intérieur du bloc deFuture{ .. }
, est-il possible pour elle de jeterInterruptedException
?InterruptedException
est plus susceptible d'être jetés avec faible niveau de filetage code. Vous pouvez généralement trouver lorsqu'une exception est utilisé/jeter dans les leurs API docs.ControlThrowable
est unThrowable
, pas unException
, et en tant que telle ne pas être pris parcase e: Exception
;case NonFatal(e)
de ne pas différer dans sa gestion il.StackOverflow
est fatale. Voir Mortels, docs. Aussi plus d'infos dans le problème de tracker et la fixation pull request et google groupes de discussionExceptions n'obtenez pas mentionné beaucoup dans la Scala, mais ils sont toujours ce qui est fait à de multiples reprises lorsque vous traitez avec l'échec inattendu.
Quand nous cherchons Quand à attraper java.lang.Erreur? plusieurs réponses, et les opinions seront présents, mais concentrons-nous sur la partie commune.
Une application raisonnable ne devrait pas essayer de l'attraper
NonFatal
est un Extracteur de non-fatal Throwables. Ne correspondront pas à des erreurs fatales commeVirtualMachineError
(par exemple,OutOfMemoryError
etStackOverflowError
, les sous-classes deVirtualMachineError
),ThreadDeath
,LinkageError
,InterruptedException
,ControlThrowable
, qui font partie de la défaillance d'une application raisonnable ne doivent pas essayer de l'attraper.Avec cela à l'esprit, nous pourrions écrire du code qui attire tous inoffensifs Throwables peut être pris par:
Si l'on regarde les appliquer la méthode, nous pouvons voir très clairement.