1

rescueステートメントの後にクラスまたはモジュールを置くことができますが、以下のコードでrescueは、このパターンに適合しない の後にメソッドが表示されます。どのように機能し、表示するように設計された出力をどのように生成していますか?

def errors_with_message(pattern)
  # Generate an anonymous "matcher module" with a custom threequals
  m = Module.new
  (class << m; self; end).instance_eval do
    define_method(:===) do |e|
      pattern === e.message
    end
  end
  m
end
puts "About to raise"
begin
  raise "Timeout while reading from socket"
rescue errors_with_message(/socket/)
  puts "Ignoring socket error"
end
puts "Continuing..."

出力

About to raise
Ignoring socket error
Continuing...
4

1 に答える 1

4

Rescue にはクラスまたはモジュールが必要です。true。したがって、そのメソッドは特別な動作をする無名モジュールを作成します。ハンドラーをrescue検索すると、===指定した例外クラス/モジュールに演算子が適用され、引数として実際の例外が渡されます。

begin
  # do something
rescue MyCustomError
  # process your error
rescue StandardError
  # process standard error
end

したがって、StandardError(またはその子孫の 1 つ) が発生した場合、最初のハンドラーはスキップされ、2 番目のハンドラーが一致します。

さて、からのモジュールerrors_with_messageは特別です。例外メッセージで一致するように threequals 演算子を再定義します。そのため、エラーが発生し、そのメッセージに「socket」という単語が含まれている場合、このハンドラーは一致します。クールなトリックですね。

于 2013-02-09T11:15:52.837 に答える