Diğer Rails istisnaları gibi davranması için Rails'te bir istisnayı nasıl oluşturabilirim?


92

Normal bir Rails istisnasının yaptığı şeyin aynısını yapması için bir istisna oluşturmak istiyorum. Özellikle, geliştirme modunda istisnayı ve yığın izini gösterin ve üretim modunda "Üzgünüz, ancak bir şeyler ters gitti" sayfasını gösterin.

Aşağıdakileri denedim:

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

Ama sadece "ERROR signing up, group missing!"development.log dosyasına yazıyor


2
Gönderdiğiniz hata mesajı bu istisnadan gelmiyor gibi görünüyor (bu farklı bir mesaj) gerçekten gördüğünüz şey bu mu?
levinalex

Yanıtlar:


141

Özel bir şey yapmak zorunda değilsin, sadece çalışıyor olmalı.

Bu denetleyiciyle yeni bir raylar uygulamam olduğunda:

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

Ve git http://127.0.0.1:3000/foo/

Yığın izleme ile istisna görüyorum.

Konsol günlüğünde tüm yığın izini göremeyebilirsiniz çünkü Rails (2.3'ten beri) , çerçevenin kendisinden gelen yığın izlemesinden satırları filtreler.

config/initializers/backtrace_silencers.rbRails projenizde görün


2
Mükemmel, kısa cevap.
rcd

1
Skitch bağlantısı (yığın izleme ile istisnayı görmek) artık çalışmıyor
Asaf

@levinalex bu, yığın izini göstermek için üretim modunda güvenli olacak mı?
BKSpurgeon

@levinalex - teşekkür ederim alex. hata mesajına özel bir dize eklemenin herhangi bir yolu var mı?
BKSpurgeon

63

Bunu şu şekilde yapabilirsiniz:

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

Burada yaptığınız şey, İstisna işlevi görecek bir "Aktif Değil" sınıfı oluşturmaktır. Yükseltme kullanarak, bir İstisna olarak "Aktif Değil" seçeneğini atabilirsiniz. rescue_from, belirli bir yöntemle (bu durumda not_activated) bir İstisnayı yakalama yoludur. Oldukça uzun bir örnek, ancak size nasıl çalıştığını göstermeli.

En iyi dileklerimle,
Fabian


Bu, geliştirme modunda istisna ve yığın izlemeyi göstermez ve üretim modunda "Üzgünüz, ancak bir şeyler ters gitti" sayfasını gösterir.
Chirag Patel

2
"Üzgünüz" sayfası aslında web sunucunuzun 500 hata işleyicisidir. .Htaccess dosyanızı kontrol edin ve genellikle orada görürsünüz
Jeff Paquette

Belki OP'ye bir cevap değil ama çok faydalı bir örnek, teşekkürler!
Neil Stockbridge

13

Bunu yapmanın daha kolay bir yoluna ihtiyacınız varsa ve fazla telaş istemiyorsanız, basit bir uygulama şu olabilir:

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

Bu bir istisna olacak, demek eilee.message = something bad happened!

ve sonra genel olarak diğer tüm istisnaları kurtarırken onu kurtarabilirsiniz.


'İstisna'yı yükseltmek veya kurtarmak iyi bir fikir değildir, bunun yerine StandardError'ı kullanmayı deneyin. Ayrıntılar için buna bakın: stackoverflow.com/questions/10048173/…
Ekamjit Singh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.