Latest web development tutorials

Ruby exception

Exceptions et l'exécution sont toujours liés. Si vous ouvrez un fichier qui n'existe pas, et ne pas gérer correctement la situation, votre programme est considéré comme étant de faible qualité.

Si une exception se produit, le programme cesse. La gestion des exceptions pour tous les types d'erreurs qui peuvent se produire lors de l'exécution du programme, afin de prendre les mesures appropriées, et ne laisseront pas le programme complètement arrêté.

Ruby fournit un mécanisme parfait pour le traitement des exceptions. Nous pouvons attacher du code qui pourrait lancer une exception, et d' utiliser les clausesde sauvetagepour dire Ruby le type parfait d'exception à traiter dans le blocdébut / fin.

grammaire

begin #开始
 
 raise.. #抛出异常
 
rescue [ExceptionType = StandardException] #捕获指定类型的异常 缺省值是StandardException
 $! #表示异常信息
 $@ #表示异常出现的代码位置
else #其余异常
 ..
ensure #不管有没有异常,进入该代码块
 
end #结束

Pourcommencertout desauvetageest protégé. Si lors de l'exécution de l'exception du bloc de code se produit, le contrôle sera passé entre lafinet le bloc desauvetage.

Pourcommencerà bloquer chaque clausede sauvetage,Ruby et l'exception levée à son tour à chaque comparaison de paramètre. Si la clause de sauvetage nommage exception et d'exception de type lancée par le même courant, ou est la classe parente de l'exception, le match a été couronnée de succès.

Si l'exception ne correspond pas du type spécifié d'erreur, nous pouvons utiliser une clauseelseaprès tout clausede sauvetage.

Exemples

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
      file = STDIN
end
print file, "==", STDIN, "\n"

Des exemples de la sortie ci-dessus est en cours d'exécution. Comme vous pouvez levoir,STDIN remplacer lefichier,parce quel'ouverturea échoué.

#<IO:0xb7d16f84>==#<IO:0xb7d16f84>

déclaration utilisationde nouvelle tentative

Vous pouvez utiliser le blocde sauvetagepour intercepter l'exception, et ensuite utiliser le bloc d'instructionsde relancecommencent àcommencerpar le début.

grammaire

begin
    # 这段代码抛出的异常将被下面的 rescue 子句捕获
rescue
    # 这个块将捕获所有类型的异常
    retry  # 这将把控制移到 begin 的开头
end

Exemples

#!/usr/bin/ruby

begin
   file = open("/unexistant_file")
   if file
      puts "File opened successfully"
   end
rescue
   fname = "existant_file"
   retry
end

Ce qui suit est le flux de processus:

  • Une exception est survenue lors de l'ouverture.
  • Passer à la rescousse. fname être réaffectés.
  • Passer au début Commençons par retry.
  • Le fichier est ouvert avec succès.
  • Poursuivre le processus de base.

Remarque: Si le fichier renommé n'existe pas, ce code de tentatives illimitées de forces.Ainsi , la gestion des exceptions, faire preuve de prudencenouvelle tentative.

déclaration utilisationraise

Vous pouvez utiliser l'instructionraiselève une exception. La méthode suivante renvoie une exception lorsque vous appelez. Son second message sera émis.

grammaire

raise 

或

raise "Error Message" 

或

raise ExceptionType, "Error Message"

或

raise ExceptionType, "Error Message" condition

La première forme simplement re-jeter l'exception actuelle (s'il ne fait pas exception actuelle est jeté un RuntimeError). Ceci est utilisé pour expliquer devant le gestionnaire d'exception exception d'exception entrant.

La seconde forme crée une nouvelle exceptionde RuntimeError,définissant son message à la chaîne donnée. Après l'appel pile à jeter l'exception.

Une troisième forme du premier paramètre pour créer une exception, puis définissez les messages connexes comme le second paramètre.

La quatrième forme et la troisième forme est similaire, vous pouvez ajouter des instructions conditionnelles supplémentaires (par exemple , àmoins)de lancer une exception.

Exemples

#!/usr/bin/ruby

begin  
    puts 'I am before the raise.'  
    raise 'An error has occurred.'  
    puts 'I am after the raise.'  
rescue  
    puts 'I am rescued.'  
end  
puts 'I am after the begin block.'  

Exécutez l'exemple ci-dessus est sortie:

I am before the raise.  
I am rescued.  
I am after the begin block.  

Un autre exemple d'utilisation de démonstrationsoulèvent:

#!/usr/bin/ruby

begin  
  raise 'A test exception.'  
rescue Exception => e  
  puts e.message  
  puts e.backtrace.inspect  
end  

Exécutez l'exemple ci-dessus est sortie:

A test exception.
["main.rb:4"]

Veillerà l'utilisation des déclarations

Parfois, peu importe si une exception est levée, vous devez vous assurer que certains processus est achevé à la fin du bloc de code. Par exemple, vous pouvez ouvrir un fichier au moment de l'entrée, lorsque vous quittez le bloc, vous devez vous assurer de fermer le dossier.

veillerà la clause de faire est la suivante. assurer placé après la dernière clause de sauvetage et contient un bloc de code de terminaison de bloc est toujours exécutée. Il est normal de quitter le bloc, lancer et gérer les exceptions si, soit à cause d'une exception non interceptée se termine, aucune de cesrelations,garantissent bloc sera toujours courir.

grammaire

begin 
   #.. 过程
   #.. 抛出异常
rescue 
   #.. 处理错误 
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

Exemples

begin
  raise 'A test exception.'
rescue Exception => e
  puts e.message
  puts e.backtrace.inspect
ensure
  puts "Ensuring execution"
end

Exécutez l'exemple ci-dessus est sortie:

A test exception.
["main.rb:4"]
Ensuring execution

Utilisation d' instructionselse

Si la clauseelseest fourni, il est habituellement placé après la clausede sauvetage,avant touteassurer.

clauseelsedu corps est exécutée que lorsque le corps du code sans lancer une exception.

grammaire

begin 
   #.. 过程 
   #.. 抛出异常
rescue 
   #.. 处理错误
else
   #.. 如果没有异常则执行
ensure 
   #.. 最后确保执行
   #.. 这总是会执行
end

Exemples

begin
 # 抛出 'A test exception.'
 puts "I'm not raising exception"
rescue Exception => e
  puts e.message
  puts e.backtrace.inspect
else
   puts "Congratulations-- no errors!"
ensure
  puts "Ensuring execution"
end

Exécutez l'exemple ci-dessus est sortie:

I'm not raising exception
Congratulations-- no errors!
Ensuring execution

Variable Utiliser $! Peut attraper le message d'erreur jeté.

Catch and Throw

lever et le mécanisme de sauvetage d'exception peut renoncer à l'exécution en cas d'erreur, vous avez parfois besoin de sauter dans le processus normal d'une structure profondément imbriqué. À ce stade, attraper et lancer utile.

catchdéfinit un nom donné (peut être un symbole ou String) étiquette comme un bloc. Bloquer l'exécution connaît normalement des rencontres d'une touche.

grammaire

throw :lablename
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

或

throw :lablename condition
#.. 这不会被执行
catch :lablename do
#.. 在遇到一个 throw 后匹配将被执行的 catch
end

Exemples

L'exemple suivant, si un utilisateur tape '!' Répondre à toute invite, utilisez un jet de mettre fin à l'interaction avec l'utilisateur.

def promptAndGet(prompt)
   print prompt
   res = readline.chomp
   throw :quitRequested if res == "!"
   return res
end

catch :quitRequested do
   name = promptAndGet("Name: ")
   age = promptAndGet("Age: ")
   sex = promptAndGet("Sex: ")
   # ..
   # 处理信息
end
promptAndGet("Name:")

Le programme ci-dessus nécessite une interaction humaine, vous pouvez essayer sur votre ordinateur. Exécutez l'exemple ci-dessus est sortie:

Name: Ruby on Rails
Age: 3
Sex: !
Name:Just Ruby

classe Exception

classes et modules standard de Ruby jetés. Toutes les classes d'exceptions forment une hiérarchie, y compris la partie supérieure de la classe Exception intérieure. La couche suivante est de sept types différents:

  • Interrompre
  • NoMemoryError
  • SignalException
  • ScriptError
  • StandardError
  • SystemExit

Fatal est la couche d'une autre exception, mais l'interprète Ruby ne l'utilisent en interne.

ScriptError et StandardError ont des sous-catégories, mais ici nous avons besoin de connaître ces détails. La chose la plus importante est de créer notre propre classe d'exception, ils doivent être une sous-classe de la classe Exception ou sa descendance.

Regardons un exemple:

class FileSaveError < StandardError
   attr_reader :reason
   def initialize(reason)
      @reason = reason
   end
end

Maintenant, regardez l'exemple suivant sera utilisé dans les exceptions ci-dessus:

File.open(path, "w") do |file|
begin
    # 写出数据 ...
rescue
    # 发生错误
    raise FileSaveError.new($!)
end
end

Ici, la ligne la plus importante estéleverFileSaveError.new ($!). Nous appelons soulever schématiquement exception a eu lieu, il a adopté une nouvelle instance FileSaveError due à des anomalies spécifiques causées par des données d'écriture échoue.