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.