2017-03-29 1 views
1

私は、Rubyのクラス間でどのようにエラーが伝播するのかを理解しようとしています。私はこれまでのところ、これを持っている:ランナーインサイドruby​​のメッセージで特定のエラーから救助できますか?

$ ruby errors.rb 
charging order soon 
This is a runtime error 

が、私は特定のメッセージをRuntimeErrorから救うことができます:私はこれを実行すると

class User 
    def charge 
    puts "charging order soon" 
    raise RuntimeError.new("This is a runtime error") 
    rescue ArgumentError 
    puts "should never gets here" 
    end 
end 

class Runner 
    def run 
    begin 
     User.new.charge 
    rescue RuntimeError => e 
     puts e.message 
    end 
    end 
end 

Runner.new.run 

、私は右のようであるこれを取得しますか?私のアプリケーションの周りに複数のRuntimeErrorsが置かれている場合、ランナーのレスキュー句がRuntimeErrorsの特定のメッセージに対してのみ呼び出される方法はありますか?

答えて

2

あなたが救助ブロック内raiseを呼び出した場合、最後に発生した例外が再発生しますhttps://stackoverflow.com/a/23771227/2981429

を参照してください。

あなたの例外ブロックでは、あなたがメッセージを確認し、再レイズするかどうかを選択することができます

begin 
    User.new.charge 
rescue RuntimeError => e 
    case e.message 
    when "This is a runtime error" 
    # put your handler code here 
    else 
    raise # re-raise the last exception 
    end 
end 

それは単にあなた自身が手動で上げるエラーを救うためにあなたの目標だ場合しかし、それはおそらくに簡単です代わりに、カスタムエラークラスを定義します。

class MyError < StandardError; end 
その後

の代わりraise RuntimeError.new("message")raise MyError.new("message")を使用し、通常はそれを救う:

begin 
    User.new.charge 
rescue MyError => e 
    # handler 
end 

この方法では、救助が組み込みの例外を妨げることを心配する必要はありません。

+0

「StandardError」のサブクラスを作成し、それから継承した特定の例外タイプを持つことを提案する理由を説明できますか?私はなぜこれを行うのか分からない:https://ruby-doc.org/core-2.2.0/Exception.html – Jwan622

関連する問題