Skip to content

Commit 62e13aa

Browse files
Watson1978claude
andcommitted
Exception#detailed_message を追加 (Ruby 3.2)
例外のメッセージに例外クラス名などの情報を追加して返すメソッド。Ruby が 捕捉されなかった例外を報告するときに使われる文字列を組み立てるもので、 did_you_mean などが上書きして候補を追加する拡張点にもなっている。 実機で確認したところ 3.0 / 3.1 には無く 3.2 からなので #%since 3.2 で囲んだ。 full_message との違いを明示した。同じ highlight: キーワードを持つが、 full_message は Exception.to_tty? の返り値が既定値なのに対し、 detailed_message は常に false が既定値で、$stderr の状態によらない。 上書きするときは知らないキーワード引数を渡されてもエラーにしないよう 注意が要る (highlight のほか did_you_mean / error_highlight / syntax_suggest が渡されうる)。ri が強調している点なので、param と本文の 両方に書き、上書きする例も添えた。 error_highlight と syntax_suggest はるりま未収録のため、リンクにせず平文に した。did_you_mean は収録済みなのでリンクにしている。 記載した例は 3.2 / 3.3 / 3.4 / 4.0 で実行し、エスケープシーケンス付きの 出力も含めて全版で一致することを確認した。NoMethodError を使う例は版で 文言が変わる (for []:Array -> for an instance of Array、3.4 でクォート変更) ため避けている。 rake check_links は 3.1 / 3.2 / 4.0 のいずれも master と同数 (262 / 296 / 297)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent f792e03 commit 62e13aa

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

manual/api/_builtin/Exception.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,3 +291,58 @@ end
291291
```
292292

293293
- **SEE** [m:Exception.to_tty?]
294+
295+
#%since 3.2
296+
### def detailed_message(highlight: false, **opt) -> String
297+
298+
例外のメッセージに情報を追加した文字列を返します。
299+
300+
[m:Exception#message] との違いは、1 行目に例外クラス名が付くことです。
301+
highlight に true を指定すると、エスケープシーケンスによる文字装飾も付きます。
302+
303+
[m:Exception#full_message] と違い、highlight の既定値は常に false です。
304+
[m:Exception.to_tty?] の値によって変わることはありません。
305+
306+
- **param** `highlight` -- エスケープシーケンスによる文字装飾をつけるかどうかを
307+
指定します。
308+
309+
- **param** `opt` -- 上書きしたメソッドが解釈するためのキーワード引数です。
310+
このメソッド自身は解釈せず、知らないキーワードを渡しても
311+
エラーになりません。
312+
313+
```ruby
314+
begin
315+
1 / 0
316+
rescue => e
317+
p e.message # => "divided by 0"
318+
p e.detailed_message # => "divided by 0 (ZeroDivisionError)"
319+
p e.detailed_message(highlight: true)
320+
# => "\e[1mdivided by 0 (\e[1;4mZeroDivisionError\e[m\e[1m)\e[m"
321+
end
322+
```
323+
324+
Ruby が捕捉されなかった例外を報告するときに、このメソッドの返り値が使われます。
325+
[lib:did_you_mean] や error_highlight は、このメソッドを上書きして
326+
「もしかして」の候補やエラー箇所の指示を追加しています。
327+
そのため、実際に得られる文字列は読み込んでいるライブラリによって変わります。
328+
329+
このメソッドを上書きする場合は、知らないキーワード引数を渡されても
330+
エラーにならないようにしてください。`highlight` のほか、`did_you_mean`
331+
`error_highlight``syntax_suggest` などが渡される可能性があります。
332+
333+
```ruby
334+
class MyError < StandardError
335+
def detailed_message(highlight: false, **opt)
336+
"custom: #{message}"
337+
end
338+
end
339+
340+
begin
341+
raise MyError, "x"
342+
rescue => e
343+
p e.detailed_message # => "custom: x"
344+
end
345+
```
346+
347+
- **SEE** [m:Exception#message], [m:Exception#full_message]
348+
#%end

0 commit comments

Comments
 (0)