Question

Je parcourais le livre Programming Ruby et j'ai du mal à comprendre les concepts suivants:

  1. Les auteurs parlent des " exceptions transitoires " cela peut se produire dans le code, puis suggérer une création de votre propre objet exception pour les gérer. Je ne pense pas comprendre parfaitement ce qu'est une erreur transitoire et quand est-il approprié de créer votre propre objet Exception. Il en parle dans le chapitre 6 lorsqu'il parle de la définition des exceptions:
  

Par exemple, certains types d'erreur réseau peuvent être transitoires. Chapitre 6.Page 97. Ajout d'informations aux exceptions.

  1. J'ai également de la difficulté à utiliser l'utilisation de Catch and Throw in Ruby. Quand est-ce mieux que de lever et de sauver?
Était-ce utile?

La solution

Pouvez-vous nous donner une référence de page aux "exceptions transitoires"? ligne?

Dans tous les cas, vous pouvez créer une nouvelle exception à tout moment, ce qui est généralement une bonne chose à faire afin de pouvoir transférer plus d'informations sur le défaut. Ceci est particulièrement utile lorsque vous avez une exception de niveau faible et que vous souhaitez en faire quelque chose de plus significatif pour l'utilisateur.

Throw / Catch in Ruby est vraiment une sorte de goto non local, comme setjmp / longjmp en C, mais se comporte mieux. Vous l'utiliserez chaque fois que vous souhaitez transférer l'exécution sur de longues distances.

Évidemment, pour la même raison, vous ne voulez pas utiliser beaucoup goto , vous ne voulez pas faire cela. L'une des principales raisons pour lesquelles vous pourriez l'utiliser est le cas d'un programme qui doit rester en cours d'exécution. Par conséquent, si vous détectez certaines erreurs, vous pouvez abandonner l'intégralité de votre travail et revenir au début.

D'accord, cela ne semble pas être à la page 97 de l'une des éditions de mon livre de pioche que j'ai, mais je vois ce que cela signifie. ... oh, le voici, page 157 de la troisième édition.

Tout d'abord, en ce qui concerne l'activité "transitoire", certains problèmes de réseau peuvent survenir, puis se résolvent d'eux-mêmes, par exemple lorsque le BOFH débranche le câble réseau et le rebranche. Ainsi, dans certaines conditions, Vous voudrez peut-être lui laisser quelques secondes pour vous calmer et réessayer avant de paniquer. comment feriez-vous cela?

Dans ce cas, ils vous ont défini un nouveau type d'exception. Cela se fait uniquement avec héritage:

class RetryException < RuntimeError
  # so this is a kind of RuntimeError which is a kind of Exception
  attr: ok_to_retry
  def initialize(ok_to_retry)
     @ok_to_retry
  end
end

alors si quelque chose ne va pas, vous pouvez déclencher sur ces nouvelles exceptions réessayables

raise RetryException.new(true), "transient read error"

qui envoie maintenant quelque chose qui ressemble à une sorte de RuntimeError dans la pile, mais qui est maintenant associé à des informations supplémentaires, c’est-à-dire un indicateur qui dit "oui, cela peut être réessayé".

NON, voici une chose vraiment astucieuse dans Ruby: elle a la capacité intégrée de réessayer certaines choses. Donc, quelque part en haut de la pile, vous avez ce code:

begin
   # do something that raises this exception
   do_something()
rescue RetryException => detail 
   # if the exception is one of these retryable ones, 
   # catch it here, but it in detail
   if detail.ok_to_retry  
      retry
   end
   # this means exactly the same as 'retry if detail.ok_to_retry`
   # from the book, btw

   # if it STILL doesn't work, send the exception on
   raise # just re-raises the last exception
end
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top