Rubyではfailキーワードは何をしますか?


88

私はRubyを学んでいて、failキーワードに遭遇しました。どういう意味ですか?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end

8
以下に加えて、raise例外を処理するときと処理failしないときに人々が使用することを知っておく価値があります。
バラ2013

6
それはキーワードではなく、メソッドです。
イェルクWミッターク

ドキュメント:Kernel#fail
Jared Beck

また、これらは1行のステートメントとして記述できることにも注意してください。fail "Password too short" if password.length < 8およびfail "No user name set" unless username
PhilT 2016

回答:


136

Rubyでは、failはと同義raiseです。failキーワードはの方法であって、Kernelクラスに含まれるモジュールObject。このfailメソッドは、raiseキーワードと同じようにランタイムエラーを発生させます。

このfailメソッドには3つのオーバーロードがあります。

  • failRuntimeErrorエラーメッセージなしでを発生させます。

  • fail(string)RuntimeErrorエラーメッセージとして文字列引数でaを発生させます:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]])exceptionオプションのエラーメッセージ(2番目の引数)とコールバック情報(3番目の引数)を使用して、クラス(最初の引数)の例外を発生させます。

    例:悪い引数が与えられた場合に失敗するはずの関数を定義するとします。を上げるのArgumentErrorではなく、を上げる方が良いですRuntimeError

    fail ArgumentError, "Illegal String"
    

    別の例:バックトレース全体をfailメソッドに渡して、rescueブロック内のトレースにアクセスできるようにすることができます。

    fail ArgumentError, "Illegal String", caller
    

    callerは、バックトレースを文字列の配列として形式で返すカーネルメソッドfile:line: in 'method'です。

引数がない場合、$で例外が発生します!または$!の場合、RuntimeErrorを発生させます。ゼロです。単一のString引数を使用すると、文字列をメッセージとしてRuntimeErrorが発生します。それ以外の場合、最初のパラメーターは、Exceptionクラス(または例外メッセージが送信されたときにExceptionオブジェクトを返すオブジェクト)の名前である必要があります。オプションの2番目のパラメーターは、例外に関連付けられたメッセージを設定し、3番目のパラメーターはコールバック情報の配列です。例外は、begin ... endブロックのrescue句によってキャッチされます。

出典:カーネルモジュールに関するRubyドキュメント


2
3つの箇条書きで3つの簡単な例を挙げていただけますか?それはあなたの答えをより具体的にするでしょう.. :)
Arup Rakshit 2013

1
うわー、+1、より良いRubyのドキュメントよりもcrazybobのruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
ボリスStitnicky

それは私のために働いたが、ルボコップはそれをに変換したraise
ポール

32

Rubocopは両方の単語の使用法について述べています。

fail代わりにraiseを使用して、例外を通知します。」

raise代わりに使用して、fail例外を再スローします。」

これが例です。

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end

スタイルアドバイザリの場合は+1。それらが意図された設定でそれぞれを意味的に同一に使用している場合でも、意図をよりよく伝えるのに役立ちます
fatuhoku 2017年


7

www.ruby-doc.orgはあなたの友達です。私がグーグルで検索したとき、rubydoc failカーネル」が最初のヒットでした。私のアドバイスは、疑わしい場合は、このような定義的なものの決定的な情報源に行くことです。


2
うわー、それは本当に失敗です。失敗のコード例は、raise o_Oからのコピー
アンド

4
@VajkHermecz failはraiseのエイリアスであるため、ドキュメントを再利用します。Array#mapおよびArray#collectのドキュメントと比較してください
Jamie Macey 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.