En effectuant la gestion des exceptions, il est possible d'identifier la cause et l'emplacement de l'erreur et de prendre les mesures appropriées pour l'erreur qui s'est produite.
Dans cet article, nous présenterons ce qui suit.
$!
$ @
rescue Écrivez le programme que vous souhaitez exécuter normalement sous commencer comme indiqué ci-dessous. Écrivez le code que vous souhaitez appeler en cas de secours si une exception se produit pendant l'exécution du programme.
begin
p "Code à exécuter"
rescue
p "Code à exécuter lorsqu'une exception se produit"
end
Résultat
"Code à exécuter"
else En ajoutant autre chose pour sauver Vous pouvez ajouter le code que vous souhaitez appeler si l'exception ne se produit pas.
begin
p "Code à exécuter"
rescue
p "Code à exécuter lorsqu'une exception se produit"
else
p "Code à exécuter si aucune exception n'est levée"
end
Résultat
"Code à exécuter"
"Code à exécuter si aucune exception n'est levée"
Exemple d'utilisation de Rescue
Si vous obtenez une exception, créez un programme qui affiche le message "Une erreur s'est produite!".
L'exception est que la chaîne n'est pas entourée de "" (guillemets doubles) et le code en cours de sauvetage est exécuté.
begin
chaîne p
rescue
p "Une exception s'est produite"
end
Résultat
"Une exception s'est produite"
ensure
En utilisant ensure pour la gestion des exceptions, vous pouvez décrire le traitement à exécuter indépendamment de la présence ou de l'absence d'exceptions.
begin
p "Code à exécuter"
rescue
p "Code à exécuter lorsqu'une exception se produit"
else
p "Code à exécuter si aucune exception n'est levée"
ensure
p "Dernier code exécuté avec ou sans exceptions"
end
Résultat
"Code à exécuter"
"Code à exécuter si aucune exception n'est levée"
"Dernier code exécuté avec ou sans exceptions"
Il est utilisé lorsqu'il y a un processus que vous souhaitez exécuter de manière fiable, même si une erreur se produit lors de l'exécution d'un processus. (Exemple) Dans le cas d'un programme qui s'ouvre et travaille sur un fichier, vous pouvez dire: "Fermez toujours le fichier à la fin, quelle que soit l'occurrence d'une exception lors de l'exécution."
(Exemple) Lorsque le processus se termine normalement
class Return
def test(n)
begin
1 / n
"Begin"
ensure
"Ensure"
end
end
end
obj = Return.new
p obj.test(1)
"Begin"
(Exemple) Lors du traitement des exceptions
class Return
def test(n)
begin
1 / n
"Begin"
rescue
'Rescue'
ensure
"Ensure"
end
end
end
obj = Return.new
p obj.test(0)
"Rescue"
return Si vous écrivez une déclaration de retour en assurer,
Pour cette raison, le traitement initialement prévu n'est pas exécuté.
À l'origine, si la récupération est éliminée et que seule la garantie est décrite comme indiqué ci-dessous, elle se terminera anormalement lors du traitement des exceptions.
class Return
def test(n)
begin
1 / n
"Begin"
ensure
"Ensure"
end
end
end
obj = Return.new
p obj.test(1)
p obj.test(0)
Résultat
(ZeroDivisionError)
Cependant, si vous écrivez une instruction return dans ensure, elle se terminera normalement comme indiqué ci-dessous.
class Return
def test(n)
begin
1 / n
"Begin"
ensure
"Ensure"
return "return ensure"
end
end
end
obj = Return.new
p obj.test(1)
p obj.test(0)
Résultat
"return ensure"
"return ensure"
class Return
def test(n)
begin
1 / n
"Begin"
rescue
'Rescue'
ensure
"Ensure"
return "return ensure"
end
end
end
obj = Return.new
p obj.test(1) #À l'origine"Begin"Est retourné
p obj.test(0) #À l'origine"Rescue"Est retourné
Résultat
"return ensure"
"return ensure"
Rescue peut également être utilisé comme un modificateur. Comme indiqué ci-dessous, si vous utilisez le qualificatif de sauvetage, vous pouvez écrire le processus selon lequel vous devez écrire clairement 5 lignes sur 1 ligne.
class Return
def test
begin
Chaîne
rescue
"error!!!"
end
end
end
obj = Return.new
p obj.test
Vous pouvez écrire sur une seule ligne en utilisant le modificateur `rescue! ''
class Return
def test
Sauvetage des cordes"error!!!"
end
end
obj = Return.new
p obj.test
Résultat
"error!!!"
Une variable spéciale est une variable qui a une signification spéciale fournie par ruby. La valeur de la variable à laquelle l'objet d'exception est affecté par sauvetage est affectée indépendamment du fait qu'elle soit spécifiée ou non.
Lorsqu'une exception se produit, l'objet d'exception (Exception) est affecté. S'il y a plusieurs exceptions, le dernier objet d'exception sera affecté. Si vous n'obtenez pas d'exception, vous obtiendrez nul.
Le backtrace où l'exception s'est produite est affecté en tant que tableau. Backtrace est les informations sur le code qui a provoqué l'exception, suivant le flux de l'ensemble du programme qui a provoqué l'exception.
[Les références] (https://qiita.com/tsubasakat/items/6825bcefcad26da3471b)
ʻExemple d'utilisation`
Même si une exception se produit sur la console (irb ou pry), la cause peut ne pas être connue car la trace arrière n'est pas affichée. Utilisez la variable spéciale $ @ pour afficher la trace des exceptions dans la console.
irb(main):002:0> puts $@
Si vous souhaitez fournir une gestion des exceptions pour l'ensemble de la méthode, vous pouvez omettre begin / end.
Un exemple d'écriture de «début / fin»
def hoge
begin
p 1/0
rescue
p "Erreur!!!"
end
end
ʻExemple d'omission de début / fin`
def hoge
p 1/0
rescue
p "Erreur! !! !!"
end
raise La méthode rise est une méthode pour lever intentionnellement une exception.
Si vous écrivez comme ci-dessous, la méthode rise lèvera une exception, la méthode de sauvetage sera exécutée et "Error !!!" sera affiché.
begin
raise
rescue
p "Erreur! !! !!"
end
"Erreur! !! !!"
Cette méthode peut également être utilisée dans le cadre du sauvetage. Outre l'arrêt anormal du programme lorsqu'une exception se produit, il peut être utilisé lorsque vous souhaitez enregistrer des informations d'exception ou envoyer un e-mail.
class Return
def test(n)
begin
1 / n
"Begin"
rescue
p "Erreur! !! !!(log)"
raise
end
end
end
obj = Return.new
obj.test(0)
"Erreur! !! !!(log)"
Traceback (most recent call last):
2: from ruby.rb:14:in `<main>'
1: from ruby.rb:4:in `test'
ruby.rb:4:in `/': divided by 0 (ZeroDivisionError)
Les classes d'exception sont similaires aux classes Ruby. Créez votre propre classe d'exceptions qui hérite de StandardError.
(Exemple)
class Error < StandardError
end
Tous les objets d'exception ruby ont un attribut de message. Essayez de définir un message par défaut pour votre propre exception comme suit:
class Error < StandardError
def initialize(msg="Error Message")
super
end
end
raise Error #=> Error Message
Vous pouvez ajouter vos propres données à l'exception.
class Error < StandardError
attr_reader :attr
def initialize(msg="default Error message", attr="value")
@attr = attr
super(msg)
end
end
begin
raise Error.new("Error message", "value")
rescue => e
puts e.attr #=> value
end
Vous avez maintenant créé votre propre exception.
Article de référence https://qiita.com/k-penguin-sato/items/3d8ce4e71520da2d68c4
https://qiita.com/ngron/items/4c319ae7340b72c7e566
Recommended Posts