Quelle est la différence - technique, philosophique, conceptuelle ou autre - entre
raise "foo"
et
raise Exception.new("foo")
?
Quelle est la différence - technique, philosophique, conceptuelle ou autre - entre
raise "foo"
et
raise Exception.new("foo")
?
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.
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 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.