Realmente no veo un uso sensato para estos. Ya hay rescue
y raise
, ¿por qué la necesidad de throw
y catch
? Parece que se supone que deben usarse para saltar desde un anidamiento profundo, pero eso me huele a goto. ¿Hay algún ejemplo de uso bueno y limpio para estos?¿Dónde es útil coger y tirar en Ruby?
Respuesta
Nota: Parece que algunas cosas han cambiado con catch/throw en 1.9. Esta respuesta se aplica a Ruby 1.9.
Una gran diferencia es que puede throw
cualquier cosa, no solo las cosas que se derivan de StandardError
, a diferencia de raise
. Algo así de tonto es legal, por ejemplo:
throw Customer.new
pero no es terriblemente significativo. Pero no se puede hacer:
irb(main):003:0> raise Customer.new
TypeError: exception class/object expected
from (irb):3:in `raise'
from (irb):3
from /usr/local/bin/irb:12:in `<main>'
Es básicamente un goto, y un poco más parecido a una llamada/cc, excepto que el flujo de control está cableado implícitamente por nombre en lugar de explícitamente como un parámetro. La diferencia entre throw/catch y raise/rescue es que la primera está destinada a ser utilizada para el flujo de control en lugar de solo situaciones excepcionales, y no pierde tiempo armando un seguimiento de pila.
Sinatra utiliza throw/catch para los códigos de error HTTP, donde un manejador puede usar throw para ceder el control a la biblioteca de Sinatra de una manera estructurada. Otros tipos de marcos HTTP usan excepciones o devuelven una clase diferente de respuesta, pero esto permite a Sinatra (por ejemplo) probar otro manejador de solicitudes después de atraparlo.
La diferencia entre los dos es que se puede únicas excepciones 'levantar', pero puede 'tirar' nada (1,9). Aparte de eso, deberían ser intercambiables, es decir, debería ser posible reescribir uno con otro, al igual que el ejemplo dado por @ john-feminella.
Pueden ser realmente útil para simplificar DSL para los usuarios finales mediante el paso de control fuera de la DSL, sin necesidad de caso complejo/if
tengo una aplicación de Rubí que permite a los usuarios ampliar que a través de una DSL interno. Algunas de las funciones de la DSL necesitan devolver el control a partes específicas de mi aplicación. Tomemos un ejemplo simple. Supongamos que el usuario está desarrollando una simple extensión en relación con las fechas
if today is a holiday then
do nothing
end
week_of_year = today.week.number
if week_of_year < 10 then
...
El bit do nothing
dispara un tiro que pasa el control de la declaración ejecutivo y de vuelta a mí.
En lugar de seguir ejecutando el DSL, con alguna condición, queremos que salga y devuelva el control a mi aplicación. Ahora puede hacer que el usuario use muchas sentencias if incrustadas y que el DSL termine de forma natural, pero eso simplemente oscurece lo que la lógica está tratando de decir.
Lanzar realmente es un goto que es 'considerado peligroso' pero maldita sea que a veces son la mejor solución.
- 1. dónde coger excepciones que devuelve Callable.call()
- 2. Coger retroceso en Chrome y Firefox es diferente
- 3. Ajax - empujar y tirar?
- 4. ¿Qué es Jython y es útil en absoluto?
- 5. Para tirar o no tirar
- 6. es jquery. ¿Es útil siempre?
- 7. ¿Cuándo es útil __proto__?
- 8. ¿Es MVVM realmente útil?
- 9. ¿Cuándo sería útil un flip-flop Ruby?
- 10. ¿Para qué sirve la memorización y realmente es tan útil?
- 11. Registro AAR en NFC: ¿Dónde está la carga útil?
- 12. Empujar y tirar ramas en Git
- 13. ¿Cuándo es útil File.join?
- 14. ¿Cuál es la diferencia entre sondear y tirar?
- 15. ¿Qué es Mage y de qué manera es útil?
- 16. ¿Qué es una función manejar y cómo es útil?
- 17. ¿Para qué es útil una tupla?
- 18. dificultad tirar NoSuchElementException en Java
- 19. ¿Cuándo es útil un ConcurrentSkipListSet?
- 20. ¿Es HttpContextWrapper todo eso ... útil?
- 21. Me gusta y dónde está la condición en ruby
- 22. XSLT transformadora es tirar de error
- 23. ¿Cómo es útil la anotación en PHP?
- 24. ¿Es "largo" todavía útil en C?
- 25. ¿Qué tan útil es Response.IsClientConnected?
- 26. Macros de OpenOffice Python: ¿Dónde puedo encontrar documentación útil?
- 27. Git buscar y tirar sin argumentos
- 28. ¿Qué diablos es ReverseHTTP y por qué sería útil?
- 29. ¿Cuándo es útil la diferencia entre quotRem y divMod?
- 30. ¿Dónde se define instance_eval en Ruby 1.9.2?
El ejemplo es legal con un rescate/aumento, también. Simplemente dice "clase o módulo requerido para la cláusula de rescate". –
Además, me dice que solo puede atrapar/lanzar un símbolo. –
@jleedev »¿Qué versión de Ruby estás ejecutando? [edit: Vaya, leí mal lo que dijiste. Hice un error al escribir la última frase, lo arreglaré.] –