2012-05-03 14 views
5

El problema es que el controlador predeterminado se define en Sinatra :: ShowExceptions, que está controlado por la configuración de configuración : raise_errors, y esta configuración es todo o nada. Si : raise_errors está desactivado, el método error se puede utilizar en la aplicación Sinatra, pero debe utilizarse para todas las excepciones y no hay acceso al controlador de errores definido en Sinatra :: ShowExceptions. Si está activado, todas las excepciones serán manejadas por el middleware ShowExceptions.En Sinatra, ¿hay alguna manera de utilizar mi propio controlador de errores para algunos errores, y el controlador predeterminado para todos los demás errores?

La razón de lo que quiero hacer es que, al menos durante el desarrollo, quiero que los errores "esperados" se manejen de manera fácil de usar y quiero que los errores "inesperados" sean manejados en un desarrollador amigable Moda.

supongo que la única manera de hacer esto es definir una clase estante middleware que hereda de Sinatra :: ShowExceptions, y que tiene alguna opción extra en su uso método para especificar qué clases de excepciones para manejar o no manejar.

¿Hay alguna otra manera más fácil que me falta?

(estoy usando jruby, si hay alguna diferencia.)

Respuesta

6

encontré que esto parece funcionar:

set :raise_errors, false 
set :show_exceptions, false 

... 

error BaseErrorClassForMySpecialErrors do 
    # ... special handling for sub-classes of this error class 
end 

$showExceptions = Sinatra::ShowExceptions.new(self) 

error do 
    @error = env['sinatra.error'] 
    $showExceptions.pretty(env, @error) 
end 

En otras palabras, establecer : raise_errors y : show_exceptions a false para desactivar ShowExceptions manejo de errores, luego crear una instancia separada de Sinatra :: ShowExceptions, y llamar a su bonito método en el error catch-all error handler.

Esperemos que la creación de una instancia adicional de Sinatra :: ShowExceptions para este propósito no tiene ningún efecto secundario involuntario.

0

He usado set: show_exceptions,: after_handler solo para este caso. También he establecido: dump_errors, false en el desarrollo, ya que de lo contrario los errores se vuelcan incluso cuando se manejan mediante el bloqueo de errores.

Cuestiones relacionadas