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