Pertanyaan Bagaimana cara menaikkan pengecualian di Rails sehingga berperilaku seperti pengecualian Rails lainnya?


Saya ingin memunculkan pengecualian sehingga ia melakukan hal yang sama dengan pengecualian Rails normal. Khususnya, tunjukkan pengecualian dan tumpukan jejak dalam mode pengembangan dan tunjukkan "Kami minta maaf, tetapi ada yang salah" halaman dalam mode produksi.

Saya mencoba yang berikut ini:

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

Tapi itu hanya menulis "ERROR signing up, group missing!" ke file development.log


75
2017-12-16 22:49


asal


Jawaban:


Anda tidak perlu melakukan sesuatu yang istimewa, seharusnya hanya bekerja.

Saat saya memiliki aplikasi rel baru dengan pengontrol ini:

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

dan pergi ke http://127.0.0.1:3000/foo/

saya melihat pengecualian dengan jejak stack.

Anda mungkin tidak melihat seluruh stacktrace di log konsol karena Rails (sejak 2.3) filter garis dari jejak stack yang berasal dari kerangka itu sendiri.

Lihat config/initializers/backtrace_silencers.rb dalam proyek Rails Anda


116
2017-12-17 00:11



Anda dapat melakukannya seperti ini:

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

Yang Anda lakukan di sini adalah membuat kelas "NotActivated" yang berfungsi sebagai Exception. Menggunakan kenaikan gaji, Anda dapat melempar "NotActivated" sebagai Pengecualian. rescue_from adalah cara menangkap Eksepsi dengan metode tertentu (tidak_aktif dalam kasus ini). Contoh yang cukup panjang, tetapi seharusnya menunjukkan cara kerjanya.

Semoga sukses,
Fabian


54
2017-12-16 22:56



Jika Anda membutuhkan cara yang lebih mudah untuk melakukannya, dan tidak mau repot, eksekusi sederhana bisa berupa:

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

Ini akan meningkatkan pengecualian, katakanlah e dengan e.message = something bad happened!

dan kemudian Anda dapat menyelamatkannya saat Anda menyelamatkan semua pengecualian lainnya secara umum.


8
2017-11-18 12:41