Pregunta

Estaba revisando el libro de programación de Ruby y tengo problemas para entender los siguientes conceptos:

  1. Los autores hablan de " excepciones transitorias " eso puede ocurrir en el código y luego sugerir una creación de su propio objeto de excepción para manejarlos. No creo que entienda completamente qué es un error transitorio y cuándo es apropiado crear su propio objeto de Excepción. Habla de ello en Capítulo 6 cuando habla sobre la definición de excepciones:
  

Por ejemplo, ciertos tipos de errores de red pueden ser transitorios. Capítulo 6.Página 97. Agregar información a las excepciones.

  1. También estoy teniendo dificultades para evitar el uso de Catch and Throw en ruby. ¿Cuándo es mejor que levantar y rescatar?
¿Fue útil?

Solución

¿Puede darnos una referencia de página a las " excepciones transitorias " ¿línea?

En cualquier caso, puede crear una nueva excepción en cualquier momento, y generalmente es bueno hacerlo para que pueda transferir más información sobre la falla. Esto es particularmente bueno cuando tiene una excepción de nivel bajo y desea convertirlo en algo más significativo para el usuario.

Throw / Catch in Ruby es realmente una especie de goto no local, como setjmp / longjmp en C, pero se comporta mejor. Lo usaría en cualquier momento que desee transferir la ejecución por un largo camino.

Obviamente, por el mismo motivo por el que no desea utilizar goto , no desea hacer esto. Una gran razón por la que podría usarlo es en el caso de un programa que debe seguir funcionando, por lo que si detecta ciertos tipos de errores, puede deshacerse de todo el trabajo que está haciendo y volver al inicio.


Bien, eso no parece estar en la página 97 de ninguna de las ediciones del libro de picos que tengo, pero veo lo que significa. ... oh, aquí está, página 157 en la tercera edición.

Primero que todo, en el negocio de " transitorio " ;, hay algunos problemas de red que pueden ocurrir, y luego se resuelven solos, por ejemplo, cuando el BOFH desenchufa el cable de red y lo vuelve a enchufar. Así que, en algunas condiciones, es posible que desee darle unos segundos para calmarse y volver a intentarlo antes de entrar en pánico. ¿Cómo harías eso?

En este caso, tienen que definir un nuevo tipo de excepción. Esto se hace solo con herencia:

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

entonces, si algo sale mal, puede solicitar estas nuevas excepciones reintentables

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

que ahora envía algo que es una especie de RuntimeError en la pila, pero ahora tiene información adicional adjunta, es decir, un indicador que dice "sí, esto puede reintentarse".

No, aquí hay una cosa realmente ingeniosa en Ruby: tiene la capacidad incorporada de reintentar algunas cosas. Entonces, en algún lugar de la pila, tienes este código:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top