Me preguntaba si la gente compartiría sus mejores prácticas/estrategias en el manejo de excepciones & errores. Ahora no estoy preguntando cuándo lanzar una excepción (se ha respondido completamente aquí: SO: When to throw an Exception). Y no estoy usando esto para mi flujo de aplicaciones, pero existen excepciones legítimas que ocurren todo el tiempo. Por ejemplo, el más popular sería ActiveRecord :: RecordNotFound. ¿Cuál sería la mejor manera de manejarlo? ¿La manera SECA?¿Cuál es la mejor estrategia para manejar excepciones y errores en Rails?
Ahora mismo estoy comprobando mucho en mi controlador, por lo que si Post.find(5)
devuelve Nil, lo verifico y lanzo un mensaje intermitente. Sin embargo, aunque esto es muy granular, es un poco engorroso en el sentido de que necesito verificar excepciones como esa en cada controlador, mientras que la mayoría son esencialmente iguales y tienen que ver con registros no encontrados o registros no encontrados, tales como Post.find(5)
no encontrado o si está intentando mostrar comentarios relacionados con la publicación que no existe, eso arrojaría una excepción (algo como Post.find(5).comments[0].created_at
)
Sé que puede hacer algo como esto en ApplicationController y sobrescribirlo más tarde en un controlador/método particular para obtener un soporte más granular, ¿sería una forma adecuada de hacerlo?
class ApplicationController < ActionController::Base
rescue_from ActiveRecord::RecordInvalid do |exception|
render :action => (exception.record.new_record? ? :new : :edit)
end
end
También esto funcionaría en caso de que no se encuentra Post.find(5)
, pero ¿qué pasa Post.find(5).comments[0].created_at
- Me refiero a que no puedo lanzar una excepción soplado completo si existe el cargo, pero no tiene comentarios, ¿verdad?
Para resumir, hasta ahora estaba haciendo muchas comprobaciones manuales usando if/else/unless o case/when (y confieso ocasionalmente begin/rescue) y buscando nil? ¿o vacío ?, etc., pero tiene que haber una mejor manera de hacerlo.
Respuestas:
@Milan: Hola Milán gracias por una respuesta - Estoy de acuerdo con lo que ha dicho, y creo que un mal uso de la palabra es una excepción. Lo que quería decir es que en este momento hago un montón de cosas como:
if Post.exists?(params[:post_id])
@p = Post.find(params[:post_id])
else
flash[:error] = " Can't find Blog Post"
end
Y hago un montón de este tipo de "manejo de excepciones", trato de evitar el uso de comenzar/rescate. Pero me parece que este es un resultado/verificación/situación lo suficientemente común como para que haya una manera más SECA de hacer esto, ¿no? ¿Cómo harías este tipo de cheque?
¿También cómo lo manejaría en este caso? Digamos que desea mostrar los comentarios fecha de creación, en su opinión:
Last comment for this post at : <%= @post.comments[0].created_at %>
Y este post no tiene ningún comentario. Usted puede hacer
Last comment for this post at : <%= @post.comments.last.created_at unless @post.comments.empty? %>
que podría hacer una comprobación en el controlador. Etc. Hay varias formas de hacerlo. Pero, ¿cuál es la "mejor" forma de manejar esto?
favor - ver mi respuesta dada en la respuesta - que no puedo publicar código correctamente sangría en los comentarios :-) – konung
Hey Nick, lo siento por sonar tan Ranty. Simplemente no tuve tiempo suficiente para agregar una parte constructiva a mi respuesta. Ahora, está allí. Espero que toda la respuesta sea más útil ahora. –
No hay problema, sin ofenderse, mi pregunta tampoco era muy clara, hasta que lo limpie. Me diste un par de buenos consejos: esperaré un poco, tal vez alguien tenga algunas sugerencias más y luego marcaré esto como respondido. Gracias por una respuesta detallada. :-) – konung