À propos de la gestion des exceptions Ruby

Qu'est-ce que la gestion des exceptions?

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."

Valeur de retour de gestion des exceptions

(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'occurrence d'exception est annulée et se termine normalement

À 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"

La valeur de ensure sera la valeur de retour de la méthode, qu'une exception se soit produite ou non.

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"

modificateur de sauvetage

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!!!"

Variables spéciales

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.

Variable spéciale $!

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.

Variable spéciale $ @

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 $@

Fournit la gestion des exceptions pour toute la méthode (début / fin omis)

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)

Créer une exception personnalisée

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

À propos de la gestion des exceptions Ruby
À propos de la gestion des exceptions
À propos de la gestion des exceptions
gestion des exceptions ruby
Gestion des exceptions Ruby
[Java] À propos de la gestion des exceptions try-catch
[Ruby] Gestion des exceptions dans les fonctions
Gestion des exceptions
Exception de traitement des exceptions
[Pour les débutants en Java] À propos de la gestion des exceptions
Gestion des exceptions Java?
À propos des symboles Ruby
À propos de Ruby Hash
À propos des tableaux Ruby
À propos de l'héritage Ruby
À propos de Ruby Block
À propos de Ruby Hash
[Java] Gestion des exceptions
☾ Java / Gestion des exceptions
À propos des symboles Ruby
À propos de la gestion des exceptions Java
Gestion des exceptions Java
À propos des méthodes Ruby
[Ruby] Traitement des exceptions, le cas échéant, restituer
À propos du module Ruby's Kernel
À propos des messages d'erreur Ruby
Pratique de gestion des exceptions (ArithmeticException)
À propos de Ruby Hash (suite)
Gestion des exceptions Spring Boot
À propos des méthodes d'instance Ruby
Réflexion sur la logique Ruby
[Java Silver] (Gestion des exceptions) À propos des instructions try-catch-finally et try-with-resource
À propos de la gestion de Null
Classes nécessitant une gestion des exceptions
Première gestion des exceptions de Java (mémoire)
[Java] Pratique de la gestion des exceptions [Exception]
Explication sur l'objet Ruby Range
Règles d'utilisation pour la gestion des exceptions Java
À propos des expressions régulières dans Ruby
À propos des hachages et symboles Ruby
Ruby à propos de divers processus itératifs
À propos de Ruby, modèle objet
À propos des classes et des instances Ruby
Techniques de gestion des exceptions en Java
Explication sur l'objet Ruby String
À propos du comportement de ruby Hash # ==
[Session d'étude interne] Gestion des exceptions Java (2017/04/26)
À propos de la gestion des erreurs de la fonction de commentaire
À propos des guillemets simples et doubles Ruby
exception
À propos de l'opérateur de produit Ruby (&) et de l'opérateur somme (|)