Apa yang dilakukan kata kunci gagal di Ruby?

88

Saya belajar Ruby dan menemukan failkata kunci. Apa artinya?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end
Mimpi
sumber
8
Selain jawaban di bawah ini, perlu diketahui bahwa orang menggunakan raisesaat menangani pengecualian dan failsaat tidak.
Bala
6
Ini bukan kata kunci, ini adalah metode.
Jörg W Mittag
Dokumentasi: Kernel # gagal
Jared Beck
Perhatikan juga, Anda dapat menulis ini sebagai pernyataan satu baris: fail "Password too short" if password.length < 8danfail "No user name set" unless username
PhilT

Jawaban:

136

Di Ruby, failsama artinya dengan raise. Kata failkunci adalah metode Kernelmodul yang disertakan oleh kelas Object. The failMetode menimbulkan error seperti raisekata kunci.

The failmetode memiliki tiga overloads:

  • fail: memunculkan RuntimeErrorpesan kesalahan tanpa kesalahan.

  • fail(string): memunculkan a RuntimeErrordengan argumen string sebagai pesan kesalahan:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): memunculkan pengecualian kelas exception(argumen pertama) dengan pesan kesalahan opsional (argumen kedua) dan informasi panggilan balik (argumen ketiga).

    Contoh: Asumsikan Anda mendefinisikan fungsi yang harus gagal jika diberikan argumen yang buruk. Lebih baik menaikkan ArgumentErrordan bukan RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Contoh Lain: Anda bisa meneruskan seluruh lacak balik ke failmetode sehingga Anda bisa mengakses jejak di dalam rescueblok:

    fail ArgumentError, "Illegal String", caller
    

    calleradalah metode kernel yang mengembalikan lacak balik sebagai larik string dalam bentuk file:line: in 'method'.

Tanpa argumen, memunculkan pengecualian di $! atau menimbulkan RuntimeError if $! nihil. Dengan argumen String tunggal, memunculkan RuntimeError dengan string sebagai pesan. Jika tidak, parameter pertama haruslah nama kelas Exception (atau objek yang mengembalikan objek Exception saat mengirim pesan pengecualian). Parameter opsional kedua menyetel pesan yang terkait dengan pengecualian, dan parameter ketiga adalah larik informasi panggilan balik. Pengecualian ditangkap oleh klausa penyelamatan blok awal ... blok akhir.

Sumber: Dokumentasi Ruby tentang Modul Kernel .

crazybob
sumber
2
Dapatkah Anda memberikan 3 contoh sederhana dengan 3 butir peluru? Ini akan membuat jawaban Anda lebih konkret .. :)
Arup Rakshit
1
Wow, +1, crazybob lebih baik daripada Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky
Ini berhasil untuk saya tetapi Rubocop mengubahnya menjadiraise
paul
32

Rubocop mengatakan tentang penggunaan kedua kata tersebut;

'Gunakan failalih-alih raiseuntuk memberi sinyal pengecualian.'

'Gunakan raisebukan failuntuk menampilkan kembali pengecualian.'

Berikut ini contohnya.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end
kuboon
sumber
1 untuk penasehat gaya; bahkan jika mereka identik secara semantik menggunakan masing-masing dalam pengaturan yang dimaksudkan membantu menyampaikan niat dengan lebih baik
fatuhoku
26

fail == raise

Dengan kata lain, failhanya alias yang populer untuk raisemetode peningkatan kesalahan. Pemakaian:

fail ArgumentError, "Don't argue with me!"
Boris Stitnicky
sumber
7

www.ruby-doc.org adalah teman Anda. Saat saya mencari di Google rubydoc fail" Kernel " adalah hit pertama. Saran saya, jika ragu, pergilah ke sumber definitif untuk hal-hal definisi seperti ini.

pjs
sumber
2
Woot, itu benar-benar GAGAL. Contoh kode untuk gagal adalah copy-paste dari raise o_O
Vajk Hermecz
4
@VajkHermecz gagal adalah alias dari kenaikan gaji, jadi ini menggunakan kembali dokumentasi. Bandingkan dengan dokumen untuk Array # map dan Array # collect
Jamie Macey