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?


Jawaban:


223

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

def foo
  ...
rescue
  ...
end

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'


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!


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.