Frage Wie verursache ich eine Ausnahme in Rails, so verhält es sich wie andere Rails-Ausnahmen?


Ich möchte eine Ausnahme auslösen, so dass es dasselbe tut, was eine normale Rails-Ausnahme tut. Zeigen Sie insbesondere die Ausnahmebedingung und die Stapelverfolgung im Entwicklungsmodus und zeigen Sie im Produktionsmodus die Seite "Es tut uns leid, aber etwas schief gelaufen ist" an.

Ich habe Folgendes versucht:

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

Aber es schreibt einfach "ERROR signing up, group missing!" in die Datei development.log


75
2017-12-16 22:49


Ursprung


Antworten:


Du musst nichts Besonderes machen, es sollte einfach funktionieren.

Wenn ich eine neue Rails App mit diesem Controller habe:

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

und geh zu http://127.0.0.1:3000/foo/

ich bin Sehen Sie die Ausnahme mit einem Stack-Trace.

Möglicherweise sehen Sie den gesamten Stacktrace nicht im Konsolenprotokoll, weil Rails (seit 2.3) filtert Linien aus dem Stack-Trace, die vom Framework selbst stammen.

Sehen config/initializers/backtrace_silencers.rb in Ihrem Rails-Projekt


116
2017-12-17 00:11



Du kannst es so machen:

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

Was Sie hier tun, ist eine Klasse "NotAktiviert" zu erstellen, die als Ausnahme dient. Mit Raise können Sie "NotAktiviert" als Ausnahme auslösen. rescue_from ist die Möglichkeit, eine Exception mit einer angegebenen Methode abzufangen (not_activated in diesem Fall). Ein ziemlich langes Beispiel, aber es sollte Ihnen zeigen, wie es funktioniert.

Die besten Wünsche,
Fabian


54
2017-12-16 22:56



Wenn Sie einen einfacheren Weg brauchen und nicht viel Aufhebens wollen, könnte eine einfache Ausführung sein:

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

Dies wird eine Ausnahme auslösen, sagen wir e mit e.message = something bad happened!

und dann können Sie es retten, da Sie alle anderen Ausnahmen im Allgemeinen retten.


8
2017-11-18 12:41