2009-12-16 10 views
68

Vorrei sollevare un'eccezione in modo che faccia la stessa cosa che fa un'eccezione normale di Rails. In particolare, mostra l'eccezione e lo stack trace in modalità sviluppo e mostra la pagina "Siamo spiacenti, ma qualcosa è andato storto" in modalità produzione.Come faccio a generare un'eccezione in Rails in modo che si comporti come le altre eccezioni di Rails?

ho provato la seguente:

raise "safety_care group missing!" if group.nil? 

Ma scrive semplicemente "ERROR signing up, group missing!" al file development.log

+2

il messaggio di errore che hai postato non sembra provenire da questa eccezione (è un messaggio diverso) è davvero questo che stai vedendo? – levinalex

risposta

108

Non devi fare nulla di speciale, si deve solo lavorare.

Quando ho un app rotaie fresco con questo controller:

class FooController < ApplicationController 
    def index 
    raise "error" 
    end 
end 

e vado a http://127.0.0.1:3000/foo/

Sono seeing the exception with a stack trace.

Si potrebbe non vedere l'intero StackTrace nel log della console a causa Rails (dal 2,3) filters lines from the stack trace that come from the framework itself.

Vedi config/initializers/backtrace_silencers.rb nei tuoi Rails proiettare

+2

Risposta eccellente e concisa. – rcd

+0

Il collegamento skitch (vedere l'eccezione con una traccia stack) non funziona più – Asaf

+0

@levinalex sarà sicuro nella modalità di produzione per mostrare lo stacktrace? – BKSpurgeon

49

si può fare in questo modo:

class UsersController < ApplicationController 
    ## Exception Handling 
    class NotActivated < StandardError 
    end 

    rescue_from NotActivated, :with => :not_activated 

    def not_activated(exception) 
    flash[:notice] = "This user is not activated." 
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip 
    redirect_to "/" 
    end 

    def show 
     // Do something that fails.. 
     raise NotActivated unless @user.is_activated? 
    end 
end 

Che cosa si sta facendo qui sta creando una classe "NotActivated" che fungerà da Eccezione. Usando raise, puoi lanciare "NotActivated" come eccezione. rescue_from è il modo di catturare un'eccezione con un metodo specificato (not_activated in questo caso). Un lungo esempio, ma dovrebbe mostrarti come funziona.

migliori auguri,
Fabian

+0

Questo non mostra l'eccezione e lo stack trace in modalità sviluppo e mostra la pagina "Siamo spiacenti, ma qualcosa è andato storto" in modalità produzione. –

+1

La pagina "ci dispiace" è in realtà il gestore degli errori del server Web 500. Controlla il tuo file .htaccess e di solito lo vedrai lì –

8

Se avete bisogno di un modo più semplice per farlo, e non lo fai vuole troppo baccano, un semplice esecuzione potrebbe essere:

raise Exception.new('something bad happened!') 

Ciò consentirà di aumentare un'eccezione, dicono e con e.message = something bad happened!

e quindi è possibile salvarlo mentre si stanno salvando tutte le altre eccezioni in generale.

Problemi correlati