Ruby'de başlangıç ​​ve bitiş bloğu olmadan rescue nasıl kullanılır?


115

Bir kurtarma başlangıcına sahip olmanın standart tekniğini biliyorum

Kurtarma bloğu kendi başına nasıl kullanılır?

Nasıl çalışır ve hangi kodun izlendiğini nasıl bilir?


Yanıtlar:


223

Bir "def" yöntemi bir "başlangıç" ifadesi işlevi görebilir:

def foo
  ...
rescue
  ...
end

3
Ayrıca, sınıf tanımları, modül tanımları ve (sanırım) do/ endblok değişmezleri örtük istisna blokları oluşturur.
Jörg W Mittag

Def rescue garantisini sonlandırabilir misin?
Mohamed Hafez

Kesinlikle def rescue garantisini sonlandırabilirsiniz :-)
Antony

Defterinizde birden fazla kurtarma kullanabilir misiniz?
marriedjane875

@ marriedjane875 evet, ya açıkça (her kurtarma maddesi / bloğu kendi satırında) gibi birden fazla kurtarma kullanabilirsiniz rescue TypeError; rescue NameError- ya da istisna sınıflarını virgülle ayırabilirsiniz, örneğinrescue TypeError, NameError
chemturion

48

Ayrıca hat içinde kurtarabilirsiniz:

1 + "str" rescue "EXCEPTION!"

"EXCEPTION!" çünkü 'Stringnum'a zorla sokulamaz'


1
Özel durum geri izleme satır içi nasıl kurtarılır ve gösterilir?
Cyril Duchon-Doris

gerçek istisna nasıl iade edilir?
user1735921

1
Hat içi kurtarma, kurtarırken StandardErrorve tüm alt sınıfları gibi, iyi bir uygulama değildir NameError- yani kodunuzdaki bir yazım hatası bile bir hata oluşturmaz .. Bkz. Thinkbot.com/blog/don-t-inline-rescue-in- yakut .
BrunoFacca

26

ActiveRecord doğrulamaları ile def / kurtarma kombinasyonunu çok kullanıyorum:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

Bence bu çok zayıf bir kod!


19

Misal:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

Burada defbir beginaçıklama olarak:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end
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.