Ruby 4.0 リファレンスマニュアル

instance method Exception#detailed_message

detailed_message(highlight: false, **opt) -> StringRuby 3.2 から[permalink][rdoc][edit]

例外のメッセージに情報を追加した文字列を返します。

Exception#message との違いは、1 行目に例外クラス名が付くことです。 highlight に true を指定すると、エスケープシーケンスによる文字装飾も付きます。

Exception#full_message と違い、highlight の既定値は常に false です。 Exception.to_tty? の値によって変わることはありません。

[PARAM] highlight:
エスケープシーケンスによる文字装飾をつけるかどうかを指定します。
[PARAM] opt:
上書きしたメソッドが解釈するためのキーワード引数です。このメソッド自身は解釈せず、知らないキーワードを渡してもエラーになりません。
begin
  1 / 0
rescue => e
  p e.message                          # => "divided by 0"
  p e.detailed_message                 # => "divided by 0 (ZeroDivisionError)"
  p e.detailed_message(highlight: true)
  # => "\e[1mdivided by 0 (\e[1;4mZeroDivisionError\e[m\e[1m)\e[m"
end

Ruby が捕捉されなかった例外を報告するときに、このメソッドの返り値が使われます。 did_you_mean や error_highlight は、このメソッドを上書きして「もしかして」の候補やエラー箇所の指示を追加しています。そのため、実際に得られる文字列は読み込んでいるライブラリによって変わります。

このメソッドを上書きする場合は、知らないキーワード引数を渡されてもエラーにならないようにしてください。highlight のほか、did_you_meanerror_highlightsyntax_suggest などが渡される可能性があります。

class MyError < StandardError
  def detailed_message(highlight: false, **opt)
    "custom: #{message}"
  end
end

begin
  raise MyError, "x"
rescue => e
  p e.detailed_message # => "custom: x"
end

[SEE_ALSO] Exception#message, Exception#full_message