estoy leyendo desarrollo web ágil con rieles y he encontrado el siguiente código¿Es una buena práctica usar excepciones para el flujo de control en Ruby on Ruby on Rails? (. 4ª ed)
class ApplicationController < ActionController::Base
protect_from_forgery
private
def current_cart
Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
cart = Cart.create
session[:cart_id] = cart.id
cart
end
end
Puesto que soy un desarrollador de Java, mi comprensión de esa parte del código es más o menos lo siguiente:
private Cart currentCard(){
try{
return CartManager.get_cart_from_session(cartId)
}catch(RecordNotFoundEx e){
Cart c = CartManager.create_cart_and_add_to_session(new Cart())
return c;
}
}
que lo que me llama la atención es que el manejo de excepciones se utiliza para controlar el flujo normal de aplicación (falta de la compra es un comportamiento perfectamente normal cuando visitas de los usuarios de aplicaciones Depot por primera vez).
Si se toma un libro de Java, dicen que esto es algo muy malo, y por una buena razón: el manejo de errores no se debe utilizar como un reemplazo de las declaraciones de control, es un poco engañoso para aquellos que leer el código
¿Hay alguna buena razón por la que tal práctica esté justificada en Ruby (Rails)? ¿Es esta una práctica común en Ruby?
No creo que hay cualquier razón especial que justifique esto aquí, y mi sensación es que la comunidad de Ruby está dividida sobre la regla de "no usar el manejo de excepciones para el flujo de control". Muchas personas te dicen que no lo hagas; muchos otros lo hacen de todos modos. (Algunos están de acuerdo con la regla, pero no siempre les importa, algunos piensan que la regla es tonta (o simplemente incorrecta), otros simplemente no piensan mucho al respecto). De cualquier manera, creo que su percepción de lo que está sucediendo en ese código es correcto. Si no te gusta, seguramente podrías volver a escribir usando un flujo de control explícito. – Telemachus
@Telemachus: esa es una buena respuesta, ¡así que publícala! – tokland
@Telemachus Su comentario es interesante. Estoy descubriendo en JRuby que la creación de rastreos de excepción a menudo está en la parte superior del uso de la CPU informada por un generador de perfiles. El benchmarking en MRI ruby muestra un impacto de rendimiento menos drástico pero aún visible por el uso de excepciones. Mi especulación es que debido a que las excepciones incluyen retrocesos y otros datos, construir uno es simplemente costoso. Ruby también tiene catch/throw (control de flujo) separado de rescue/raise (excepciones), y he oído que catch/throw no es un problema de rendimiento en JRuby. – Patrick