From: KOSAKI Motohiro Date: 2013-08-04T05:56:49+09:00 Subject: [ruby-dev:47574] Re: [ruby-trunk - Feature #8726][Open] Class#source_location > Classオブジェクトが生成された場所を返す Class#source_location メソッドの実装を希望いたします。 > > これによって解決される問題の例としては、Timeout::timeout が無名の例外クラスオブジェクトを raise した > 場合に、どこで仕掛けられた timeout なのか、発生場所を特定できるようになります。 > このようなケースでは、例外オブジェクトが保有している backtrace はtimeoutが発生した時点での > プログラム実行位置を起点としており、Timeout::timeout(...) を仕掛けた場所の情報は失われています。 言ってることが今ひとつ理解できません。 test.rb ーーーーーーーーーー 1: require "timeout" 2: 3: def foo 4: sleep 10 5: end 6: 7: Timeout.timeout(1) { 8: foo 9: } というコードの結果は % ./ruby-trunk ../test.rb ../test.rb:4:in `sleep': execution expired (Timeout::Error) from ../test.rb:4:in `foo' from ../test.rb:8:in `block in
' from ../test.rb:7:in `
' であり、タイムアウトが発生した時点でのプログラム実行位置(foo内の行番号4)と Timeout仕掛けた場所(行番号7から9のブロック)は両方共わかるように見えます。 なるせさん、わたし、あのバックトレースの整形処理がイマイチ理解できんのだが、 あれはどういう処理を意図してるの。