2012-05-03 12 views
5

Il problema è che il gestore predefinito è definito in Sinatra :: ShowExceptions, che è controllato dall'impostazione di : raise_errors e questa impostazione è tutto o niente. Se : raise_errors è spento allora il metodo errore può essere utilizzato in app Sinatra, ma deve essere utilizzato per tutte le eccezioni, e non c'è accesso al gestore degli errori definito nella Sinatra :: ShowExceptions. Se è attivo, tutte le eccezioni vengono gestite dal middleware ShowExceptions.In Sinatra, c'è un modo per usare il mio gestore di errori per alcuni errori e il gestore predefinito per tutti gli altri errori?

La logica di ciò che voglio fare è che, almeno durante lo sviluppo, voglio che gli errori "attesi" vengano gestiti in modo user-friendly e voglio che gli errori "inaspettati" vengano gestiti in un ambiente sviluppatore moda.

Sto indovinando che l'unico modo per farlo è quello di definire una classe cremagliera middleware che eredita da Sinatra :: ShowExceptions, e che ha qualche opzione in più nel suo uso metodo per specificare quali classi di eccezioni gestire o non gestire.

C'è un modo più semplice che mi manca?

(sto usando JRuby, se questo fa alcuna differenza.)

risposta

6

ho scoperto che questo sembra funzionare:

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 

In altre parole, impostare : raise_errors e : show_exceptions a false per disattivare la gestione degli errori ShowExceptions, quindi creare un'istanza separata di Sinatra :: ShowExceptions e chiamare il numero metodo grazioso nell'errore do gestore di errore catch-all.

Si spera di creare un'istanza aggiuntiva di Sinatra :: ShowExceptions per questo scopo non ha effetti collaterali indesiderati.

0

Ho usato set: show_exceptions,: after_handler solo per questo caso. Ho anche impostato: dump_errors, false in sviluppo poiché altrimenti gli errori vengono scaricati anche se gestiti dal blocco errori.

Problemi correlati