Exceptionにフックしたい(試行錯誤の過程〜諦めまで)
めちゃめちゃくだらなくてどうでもいい事だけれども、
irbを起動して、
irb(main):001:0>a NameError: undefined local variable or method `a' for main:Object from (irb):1 irb(main):002:0>raise "aiueo" RuntimeError: aiueo from (irb):2
とか、なんでもいいけれども、
何らかのエラーが出たときに、
「エラーなの('・ω・`)」
という表示を加えて出してみたい。
多分やり方は色々あるだろうけど、raiseメソッドをオーバーライドしてからsuperで呼び出すフックをする事で出来ないかなーと。
イメージとしては、
.irbrcファイルで
raiseメソッドをオーバーライドする下記記述のメソッドを追加して・・・
def raise(exception = RuntimeError, string = nil, array = caller) puts("エラーなの('・ω・`)") super end
ってしてあげれば出来るんじゃないかなーって思ったんだけど、ダメだった。
上記追加した場合
irb(main):001:0>a NameError: undefined local variable or method `a' for main:Object from (irb):1 irb(main):002:0>raise "aiueo" エラーなの('・ω・`) TypeError: exception class/object expected from C:/Users/保存ユーザ名/.irbrc:111:in `raise' from C:/Users/保存ユーザ名/.irbrc:111:in `raise' from (irb):2
となった。
ここで気になるのは2点。
NameErrorとかraiseメソッドを通らずに、
どこかで返り値としてExceptionの派生クラスがそのまま返されてるのかな?ってこと。
もう1点は、
raiseだとうまくいったように見えて、RuntimeErrorになっていないこと。
これは記述的に単に間違ってるだけなきもするような、違うような。
TypeErrorは、不正な型を使用したときに発生するみたい。
expectedの和訳は、予想された, 期待された。
クラスかオブジェクトのExceptionを投げれてないって事なのかも。
ってことはどうしたもんか。
raise自体は、
Kernelモジュールで定義されていて、
それがObjectクラスでインクルードされてるみたい。
ここがヒントになりそうな気がするね。
http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html
ここを見ると、
Kernelモジュールには
raise
raise(exception)
raise(message)
raise(error_type, message [, backtrace])
fail(error_type, message [, backtrace])
この5つがあって、分かれてるのかも。
http://www.ruby-doc.org/core/classes/Kernel.html#M001410
raise
raise(string)
raise(exception [, string [, array]])
fail
fail(string)
fail(exception [, string [, array]])
ここを見るとちょっと違う。
もうちょっと試行錯誤してみる。
最近、こういうちょっとしたくだらない思いつきをやろうとしたり、
その試行錯誤をしたりしてみることは結構いい勉強になって、
それをまとめてアウトプットしていく事は自分のやってきた事や知識の証明になるという事に気付きました。
後者は元々分かっていながら大体3日坊主で終わってたりしたんだけれど、
くだらないことをやってみるってのは良いもんですね。
プログラム初心者が、どうしたら次のステップアップに進めるかって時にオススメです。
内部の細かい挙動を色々試しながら、
こうしたら出来るかな? → 出来なかった、でもこうなるんだ!と新しい発見があったり
こうしたらエラーになる → このエラーはどういうエラーだろう?
こうしたら出来た! → なるほどね
と、色々得ることが出来て、少しずつ理解が深まります。
私のRubyへの理解はまだまだですけれどもw
こちらのエラーのフックに関しては、もうちょっと調べてまた記事を書きたいと思います。
この程度の未熟者です、精進精進!
==========19:10追記=============
2つ目のURLにCのソースコードがあった。
これは自分には読めない!結構難しいぞということだけ理解。
思ったより難しい事だったんだという収穫が得られただけでもよしとする。
今の自分の技量では出来ない。
ただ、NameErrorとかがraiseメソッドを通さずに返ってるっぽいのは気になるね。
1.8.6だからかな?
いつかもう少し理解が深まったらraiseの構造をもう少し勉強しよう。
==========19:10ここまで=============