100 votes

Quelle est la différence entre "lever "foo"" et "lever Exception.new("foo")`` ?

Quelle est la différence - technique, philosophique, conceptuelle ou autre - entre

raise "foo"

et

raise Exception.new("foo")

?

118voto

Daniel Lucraft Points 3323

Techniquement, la première soulève une RuntimeError dont le message est fixé à "foo" et la seconde soulève une exception dont le message est défini comme suit "foo" .

En pratique, il y a une différence significative entre les cas où vous souhaitez utiliser la première solution et ceux où vous souhaitez utiliser la seconde.

Pour faire simple, vous voulez probablement un RuntimeError pas un Exception . Un bloc de sauvetage sans argument attrapera RuntimeErrors mais n'attrapera PAS Exception s. Ainsi, si vous soulevez un Exception dans votre code, ce code ne l'attrapera pas :

begin
rescue
end

Afin d'attraper le Exception vous devrez le faire :

begin
rescue Exception
end

Cela signifie que, dans un sens, une Exception est une erreur "pire" qu'une RuntimeError parce que vous devez faire plus de travail pour vous en remettre.

Le choix dépend donc de la façon dont votre projet gère les erreurs. Par exemple, dans nos démons, la boucle principale a un sauvetage vide qui attrapera RuntimeErrors de les signaler, puis de continuer. Mais dans une ou deux circonstances, nous voulons que le démon meure vraiment vraiment sur une erreur, et dans ce cas, nous levons une alerte Exception qui passe directement par notre "code normal de gestion des erreurs" et sort.

Et encore une fois, si vous écrivez du code de bibliothèque, vous voulez probablement une RuntimeError et non un Exception car les utilisateurs de votre bibliothèque seront surpris de voir qu'il y a des erreurs dans le fait qu'une page blanche a été créée. rescue le bloc ne peut pas attraper, et il leur faudra un moment pour comprendre pourquoi.

Enfin, je dois dire que le RuntimeError est une sous-classe de la StandardError et la règle actuelle est que, bien que vous pouvez raise tout type d'objet, le blanc rescue n'attrapera par défaut que les éléments qui héritent de StandardError . Tout le reste doit être spécifique.

33voto

ennuikiller Points 28005

Extrait de la documentation officielle :

raise   
raise( string )
raise( exception [, string [, array ] ] )

Sans argument, lève l'exception dans $! ou soulève un RuntimeError si $! est nulle. Avec un seul String il soulève un RuntimeError avec la chaîne de caractères comme message. Sinon, le premier paramètre doit être le nom d'un fichier Exception (ou un objet qui renvoie une classe Exception lors de l'envoi de l'exception). Le deuxième paramètre facultatif définit le message associé à l'exception, et le troisième paramètre est un tableau d'informations de rappel. Les exceptions sont capturées par la clause de sauvetage de begin...end blocs.

raise "Failed to create socket"
raise ArgumentError, "No parameters", caller

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X