Come faccio a sollevare un'eccezione in Rails in modo che si comporti come le altre eccezioni di Rails?


91

Vorrei sollevare un'eccezione in modo che faccia la stessa cosa che fa una normale eccezione di Rails. In particolare, mostra l'eccezione e la traccia dello stack in modalità di sviluppo e mostra la pagina "Siamo spiacenti, ma qualcosa è andato storto" in modalità di produzione.

Ho provato quanto segue:

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

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


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

Risposte:


139

Non devi fare niente di speciale, dovrebbe funzionare.

Quando ho una nuova app rails con questo controller:

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

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

Vedo l'eccezione con un'analisi dello stack.

Potresti non vedere l'intero stacktrace nel log della console perché Rails (dalla 2.3) filtra le righe dallo stack trace che provengono dal framework stesso.

Vedi config/initializers/backtrace_silencers.rbnel tuo progetto Rails


2
Risposta eccellente e concisa.
rcd

1
Il collegamento skitch (vedendo l'eccezione con una traccia dello stack) non funziona più
Asaf

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

@levinalex - grazie alex. c'è un modo per aggiungere una stringa personalizzata al messaggio di errore?
BKSpurgeon

62

Puoi farlo 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

Quello che stai facendo qui è creare una classe "NotActivated" che fungerà da eccezione. Usando raise, puoi lanciare "NotActivated" come eccezione. rescue_from è il modo per catturare un'eccezione con un metodo specificato (not_activated in questo caso). Un esempio piuttosto lungo, ma dovrebbe mostrarti come funziona.

I migliori auguri,
Fabian


Questo non mostra l'eccezione e la traccia dello stack in modalità di sviluppo e mostra la pagina "Siamo spiacenti, ma qualcosa è andato storto" in modalità di produzione.
Chirag Patel

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

Forse non una risposta all'OP ma un esempio molto utile, grazie!
Neil Stockbridge

11

Se hai bisogno di un modo più semplice per farlo e non vuoi molte storie, una semplice esecuzione potrebbe essere:

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

Questo solleverà un'eccezione, diciamo econe.message = something bad happened!

e poi puoi salvarlo mentre stai salvando tutte le altre eccezioni in generale.


Non è una buona idea sollevare o salvare 'Eccezione' stessa, prova invece a usare StandardError. Vedere questo per i dettagli: stackoverflow.com/questions/10048173/...
Ekamjit Singh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.