Exceptionにフックしたい(若干出来た?)
試行錯誤の結果、ちょっと出来たっぽい。
どうもraiseのエラーは、
printで呼ばれるようなので、そこでNameErrorとかを拾ってraiseを明示的に起こせば、
無理やり
「エラーなの('・ω・`)」
とは出せた。
#Windows用。 コンソール表示時にsjisに変換する def print(*arg) if arg[0] && !arg[0].is_a?(String) if Object.const_defined?(arg[0].to_s.to_sym) && arg[0].new.is_a?(Exception) raise(arg[0], arg[2]) end end if arg.empty? str = "" else str = arg end arg.is_a?(String) ? str.to_s.tosjis : super(str) end def err_message puts("エラーなの('・ω・`)") end def raise(*arg) err_message begin super(*arg) rescue => e p e puts e.backtrace end end
こんな感じ。
C:\>irb irb(main):001:0>a エラーなの('・ω・`) #<NameError: undefined local variable or method `a' for main:Object> C:/xxxx/.irbc:131:in `raise' (以下backtrace略) irb(main):002:0>raise エラーなの('・ω・`) RuntimeError C:/xxxx/.irbc:131:in `raise' (以下backtrace略) irb(main):003:0>raise "test" エラーなの('・ω・`) #<RuntimeError: test> C:/xxxx/.irbc:131:in `raise' (以下backtrace略) irb(main):004:0>a = ([)] エラーなの('・ω・`) #<RuntimeError: test> C:/xxxx/.irbc:131:in `raise': compile error(SyntaxError) (irb):4: syntax error, unexpected ')', expecting']' a = ([)] ^ from C:/Users/xxxx/.irbc:74:in `print' from C:/Ruby/lib/ruby/1.8/irb.rb:159:in `eval_input' from C:/Ruby/lib/ruby/1.8/irb.rb:263:in `signal_status' from C:/Ruby/lib/ruby/1.8/irb.rb:147:in `eval_input' from C:/Ruby/lib/ruby/1.8/ruby-lex.rb:244:in `each_top_level_statement' from C:/Ruby/lib/ruby/1.8/ruby-lex.rb:230:in `loop' from C:/Ruby/lib/ruby/1.8/ruby-lex.rb:230:in `each_top_level_statement' from C:/Ruby/lib/ruby/1.8/ruby-lex.rb:229:in `loop' from C:/Ruby/lib/ruby/1.8/ruby-lex.rb:229:in `each_top_level_statement' from C:/Ruby/lib/ruby/1.8/irb.rb:70:in `start' from C:/Ruby/lib/ruby/1.8/irb.rb:69:in `catch' from C:/Ruby/lib/ruby/1.8/irb.rb:69:in `start' from C:/Ruby/bin/irb:13 C:\>
SyntaxErrorの時には上手くいかずirb強制終了。
惜しくも上手くいかなかった感じ。
最初の雲をつかむ状況よりは大分良くなったけれども!
ただ、ずーっとこれをやっていて思い始めた。
「エラーなの('・ω・`)」
なんて表示を見るたびに、軽いフラストレーションが蓄積されることにwww
やっぱりデフォルトで、何も無いのが一番!
と、消すことにしました。
SyntaxErrorの対応を仕切れていないので、完了せず放置になっちゃった気もするけれども。
Kernelのソースを見て悶絶して、
エラーはprintメソッドで出力されていて、
raiseで起きるエラーと、raiseを介さずエラーが起きる場合がある。
これが分かっただけでも勉強になった!
ってことでこのコードは.irbrcファイルから消すことにしますw