[RAILS] [Ruby] Traitement des exceptions, le cas échéant, restituer

Par exemple, supposons que vous souhaitiez analyser certaines données et stocker uniquement des données spécifiques dans la base de données. Parmi eux, s'il y a une extension qui ne peut pas être analysée, une erreur se produira, le traitement sera interrompu et un bogue se produira.

Par conséquent, le traitement des exceptions est pratique et il est possible d'effectuer un traitement dans le cas d'un cas d'exception sans interrompre le traitement.

En effet, il est possible de réaliser «si donné, redonner, redonner».

Cette fois, regardons la gestion des exceptions en utilisant un simple calcul comme exemple.

Le traitement lorsqu'une erreur se produit commence / sauvetage

Dans Ruby, lorsque j'essaye de diviser 10 par 0, j'obtiens une erreur.

python


puts 10 / 0
puts "Bonjour"
divided by 0 (ZeroDivisionError)

Le processus est interrompu au milieu.

Donc, --Enclenchez la partie susceptible d'être la cible de l'erreur par begin.

python


begin
  10 / 0
rescue
  p "Ne casse pas à 0"
end

puts "Bonjour"
"Ne casse pas à 0"
"Bonjour"

Le traitement n'a pas été interrompu et le traitement des erreurs et le traitement normal ont été exécutés.

Abréviation

Sauvetage sans commencement

python


puts 10 / 0 rescue 0
puts 10 / nil rescue 0 
0
0

Stockez le contenu de l'erreur dans une variable rescue =>

python


begin
  10 / 0
rescue => e
  puts e
end

puts "Bonjour"
divided by 0
Bonjour

L'objet d'erreur est stocké dans la variable e et peut être généré.

Modifier le traitement pour chaque "objet de message d'erreur" de secours d'erreur

python


begin
  10 / 0
rescue NoMethodError
  puts "Il n'y a pas de telle méthode"
rescue ZeroDivisionError
  puts "Ne casse pas à 0"
end
Ne casse pas à 0

Puisqu'il correspond au deuxième message d'erreur, il répond au sauvetage.

point important

Si le parent de la classe d'exception cible est décrit en premier, il sera traité en premier.

python


begin
  10 / 0
rescue StandardError
  puts "Erreur de base"
rescue ZeroDivisionError
  puts "Ne casse pas à 0"
end
Erreur de base

Soulever pour générer une erreur explicite et interrompre le processus

L'utilisation prévue est

  1. Lorsque les paramètres ne sont pas attendus
  2. En cas d'accès non autorisé

python


begin
  raise NoMethodError
rescue => e
  p e
end
NoMethodError

Soulevez votre propre erreur

Héritons de la classe d'exception (classe StandardError).

python


class Hoge < StandardError
end

begin
  raise Hoge
rescue => e
  p e
end
#<Hoge: Hoge>

Même s'il y a une erreur, réessayez depuis le début

python


num = 0

begin
  puts 10 / num
rescue ZeroDivisionError => e
  puts e
  num = 1
  retry
end

puts "Fini"
divided by 0
10
Fini

Dans la première boucle, il y a eu une erreur Dans la deuxième boucle, le traitement est effectué normalement.

Traitement à effectuer avec ou sans erreur garantir

python


begin
  puts "Pas exception"
rescue => e
  puts e
ensure
  puts "Hello"
end
Pas exception
Hello

s'assurer est toujours effectuée à tout moment.

Qu'est-ce qu'un objet d'erreur supplémentaire?

python


begin
  10 / 0
rescue => e
  puts e.class
  puts e.class.superclass
  puts e.class.superclass.superclass
  puts e.class.superclass.superclass.superclass
end
ZeroDivisionError
StandardError
Exception
Object

Exception est la classe source et Object est son parent

Recommended Posts

[Ruby] Traitement des exceptions, le cas échéant, restituer
gestion des exceptions ruby
Gestion des exceptions Ruby
À propos de la gestion des exceptions Ruby
[Ruby] Gestion des exceptions dans les fonctions
Gestion des exceptions
Exception de traitement des exceptions
Gestion des exceptions Java?
À propos de la gestion des exceptions
À propos de la gestion des exceptions
[Java] Gestion des exceptions
☾ Java / Gestion des exceptions
À propos de la gestion des exceptions Java
Gestion des exceptions Java
Pratique de gestion des exceptions (ArithmeticException)
Gestion des exceptions Spring Boot