Ruby - レスキュー後に特定の例外を確認する方法は?

概要

Ruby では、特定の例外に対して何か特別なことをしたいのですが、特定の救済を行うには十分ではありません。レスキュー内の特定の例外をチェックするための適切な構文は何ですか?

サンプル (動作しない) コード:

begin
   c = d
rescue => ex
  if ex == NameError
    puts 'NameError'
  else
    puts ex.message
  end
end

解決策

あなたの例では、 ex は例外のインスタンスであり、Class オブジェクトである == 演算子を使用してクラス自体と比較すると、期待される結果が得られません。エラーのクラスを実際のクラス オブジェクトと比較して確認する必要があります。

# A NameError or an error that is a subclass of NameError
ex.is_a?(NameError)
ex.kind_of?(NameError)

# NameError ONLY, not even sub-classes of NameError
ex.instance_of?(NameError)

他にも確認できる方法は多数ありますが、私が概説した以前の方法が最も一般的に使用され、通常は「推奨される」方法です。クラスに対して等価性を使用することもできますが、これは柔軟性が低く、根本的な意図が明確ではないため、通常はこれを実現する推奨方法ではありません。上記の例は、クラスのサブクラスをどのように処理するかを正確に示しています。指定されたエラー。

ex.class == NameError

微妙な違いをうまく説明しているこの回答を見つけました。