Humanity

Edit the world by your favorite way

例外で上位のcatchを生かしたい

追記:
全体的に間違ってました。id:eagletmtさんのコメント参照。


なんでtry, catchと来てfinallyだけ副詞なの。まぁそれは置いといて。*1

ふとcatchの処理を一番上位の関数が決定権を持つといいなーと思った。
つまり普通のエラーハンドリング(というかcatch)の逆。


たとえば f() -> g() -> h() と来た時に g() に catch があったとして
h() で例外が起きたら g() で catch されるわけだけど
f() で g() が catch する型に対してなんらかの処理をしたいとして、
(たとえば g() がエラーログを書き込む、ということだったら f() でその処理をスキップしたいとか)
f() で明示的にその g() が catch する型*2に対してg() の処理を「オーバーライド*3」する。


というのもエラーが起きた時*4にどうこうしたいのは上位であるはずだよなーということを思ったのでした。
Lispのコンディションとかいろんな言語にいろんな例外仕様があっておもしろいのだけど
上位のハンドラが生かされる、というのはない気がした。


つまりcatch節というのは例外ハンドラ用メソッドを持つクラスにメソッドをオーバーライド/追加する*5構文だったんだよ!
な、なんだっt(ry


でもこれ既存言語でやろうとしたらcall/cc的なアレが必要になりそうな予感。
別にSchemeとかでなくてもそれっぽいものはPerl*6とかRubyにもあるよ!

*1:そういや最近こんなポストを見た http://twitter.com/wraith13/statuses/10624414211121152

*2:というか一意的に決まるものであればなんでも

*3:逆っぽいけど

*4:に限らずなんらかのイベントがあった時

*5:それも派生とは逆?側に

*6:http://search.cpan.org/dist/Scope-Escape/ http://search.cpan.org/dist/Continuation-Escape/