最近は例外に関する主張・考察・その他何かを書くのが流行っているらしいので私も一つ

追記:
ここで言う「エラー」「エラー処理」は、「例外」「例外ハンドリング」と置き換えて読んでください。
あと元ネタへのリンク http://d.hatena.ne.jp/bleis-tift/20090809/1249825777 と、この記事が踏まえている話 http://d.hatena.ne.jp/DigitalGhost/20090621/1245602788 http://d.hatena.ne.jp/DigitalGhost/20090622/1245685626 http://d.hatena.ne.jp/DigitalGhost/20090622/1245685627

まぁtwitterにpostした内容そのまんまを拾い上げて(といってもEmacsのバッファに残ってたものを整形しただけだけど)、それをまとめただけですね。あと何回も同じような言ってるような気がする。それと、例によって論点は定まっていないし、相変わらず机上の空論なのでそこらへんは了承していただきたいです。

極端な話、例外を全部文字列で表現して、あるレベルで捕捉する必要がある場合は正規表現でマッチとって拾うとか(これはかなり乱暴*1)、とにかく全てのエラーのうち、そのレベルで処理するべきエラーが可能な限り正確に、かつ記述が面倒にならずに捕捉したいというのが一つある。

あと、そもそもそのレベルで拾って処理していいのかどうかという判断基準は、そのレベル以外の以外の全てに依ると思っているけど、まぁよく分からない。捕捉する側に関しては、他にも、何度かつぶやいてるけどCSSのタグ的な考え方もあるし、とにかくどうやったら自分が関心のある件だけ拾えるのかが難しい。

あるいは、そもそも一箇所で処理できない類のエラーというのはどうなるのか?例えば、network_file_errorというものありけりで、あるレベルではnetworkに関するエラーを処理します。ところがこのエラーはfileに関するエラーも含んでいるわけで、その部分を無視していいのかどうかはネットワークエラー処理の部分では分からないはず。ということは再スローしなければいけないか、その前にネットワークエラーとファイルエラーが直交していればいいけど、そうじゃないかもしれない。つまりはcome fromをくれたらうれしいかも知れないという結論に至ったんだけど、その経緯を説明するのは難しい。

http://twitter.com/DecimalBloat

雑すぎるのでまとめると、とりあえずはエラーを正しい場所で、正しく選って、正しく処理できればいい、そのためのエラー情報は型によるタグ付けだろうが文字列で投げて正規表現だろうが、入れ子連想配列だろうがなんだっていい、という結論ですが、その前に「正しく」というのが、あるエラー処理の位置以外の全てのコードによって決まってくるのではないか?というふうに考えてまして。そこより上位が変化しようとも下位が変化しようとも、その場所における「正しく」の意味が変わってしまう。まぁ今眠いのできっちりした具体例とか書けないですけど(眠くなくても書けないし、眠くないならめんどくさがって書かないですけど)、

// C++っぽいもの
try {
    ... // もともとはローカルのファイルしか扱っていなかったが、ライブラリが新しくなってネットワーク越しのファイルも扱うようになった
} catch (file_error const & e) {
    ... // try 部分の事情が変わったことに対して、この部分はこのままで良いのか?
}

というような心配です。ここで、class network_file_error : public network_error, file_error; という型で例外が投げられたとして、上のcatchブロックは「適切に」処理してそのまま終了してしまう。「適切に」?あほか、ネットワークエラーについてはどないやねん?ってな具合です。もちろん network_file_error という型の作り方が悪いのかもしれないし、それともここの部分の作りが悪いのかもしれない。ただ、勝手にハンドリングして別のエラーごと握りつぶしてるというのは、別にこの例でなくても、どういう手段を取っても既存の例外のような仕組みでは起きちゃいそうな予感です。上の場合、一番いいのはcatch節を書きなおすことだと思いますが、それだと上位のコードが下位に引きずられることになります。ここでは書き換えないで済ませたい、ただしここで処理できないことはそのまま上に流したい、というような結構無茶な要求ですね。なんとかしたいのです。
眠い。気が向いたら追記か別エントリーで続き書く。

*1:これに関しては、twitteralohakun さんから、Plan9 は signal で文字列投げるというようなことを教えていただいたので、そうでもないかも知れません