Bagaimana seseorang menggunakan penyelamatan di Ruby tanpa blok awal dan akhir

115

Saya tahu tentang teknik standar memulai penyelamatan akhir

Bagaimana seseorang hanya menggunakan blok penyelamat itu sendiri.

Bagaimana cara kerjanya dan bagaimana cara mengetahui kode mana yang dipantau?

Sid
sumber

Jawaban:

223

Metode "def" dapat berfungsi sebagai pernyataan "mulai":

def foo
  ...
rescue
  ...
end
alex.zherdev
sumber
3
Juga, definisi kelas, definisi modul dan (menurut saya) do/ endliteral blok membentuk blok pengecualian implisit.
Jörg W Mittag
dapatkah Anda melakukan penyelamatan def memastikan akhir juga?
Mohamed Hafez
Anda benar-benar dapat melakukan penyelamatan def memastikan juga mengakhiri :-)
Antony
dapatkah Anda menggunakan lebih dari satu penyelamatan di def Anda?
menikahjane875
@riedjane875 ya Anda dapat menggunakan beberapa penyelamatan, baik secara eksplisit (setiap klausa penyelamatan / blok pada barisnya sendiri) seperti rescue TypeError; rescue NameError- atau Anda dapat memisahkan koma kelas pengecualian, misalnyarescue TypeError, NameError
chemturion
48

Anda juga dapat menyelamatkan inline:

1 + "str" rescue "EXCEPTION!"

akan mencetak "PENGECUALIAN!" karena 'String tidak dapat dipaksa masuk ke Fixnum'

peku
sumber
1
Bagaimana Anda menyelamatkan dan menampilkan pengecualian lacak balik sebaris?
Cyril Duchon-Doris
bagaimana cara mengembalikan pengecualian sebenarnya?
pengguna1735921
1
Penyelamatan inline bukanlah praktik yang baik karena menyelamatkan StandardErrordan semua subkelasnya, seperti NameError- artinya bahkan kesalahan ketik dalam kode Anda tidak akan menimbulkan kesalahan .. Lihat thinkbot.com/blog/don-t-inline-rescue-in- ruby .
BrunoFacca
26

Saya sering menggunakan kombinasi def / penyelamatan dengan validasi ActiveRecord:

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

Saya pikir ini adalah kode yang sangat ramping!

Edwin V.
sumber
19

Contoh:

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

Di sini, defsebagai beginpernyataan:

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
Hieu Le
sumber