Rubyのcatch, throwの作法

rubyのcatch throwは安心して利用できるのか? 」が面白かった。今まで使い込んだことがないから深く考えてなかった。いわれてみると、確かにブロック付きメソッドが勝手にthrowを握りつぶすと問題があるな。

でも、どこだったか忘れたけれども標準ライブラリか何かで「このシンボルをthrowします」「catchします」ってドキュメント化されてるのを見た記憶がある。そのドキュメントの意味は上の記事を読んで初めて気づいたわけだけれども。

それに、ドキュメント化しないままに勝手に握りつぶしたり翻訳したりすると問題があるのは例外も同じだしな。Rubyと限らず、C#delegateJavaの匿名クラスをコールバックに用いている場面でその中から例外が発生したのを握りつぶしても同じだしな。

だとすると、結論は「catch, throwは問題がある」ではなくて、「例外やRubyのKernel#throwの使用に当たってはきちんとドキュメント化しましょう」だな。とりあえず、上の記事で例示しているFind.find, Optparse#order!, PStore#transactionは現在ドキュメントに何も書いていないので問題だな。

私はJavaがドキュメント化の習慣をChecked exceptionsとして言語仕様にきっちり組み込んでるのが好きなんだけど。だから、SQLExceptionがうざったいのはよくよく分かるけれども、それでもRuntimeExceptionの乱用は好きじゃない。Spring Frameworkはその辺勝手に例外翻訳しすぎだと思ってる。

とにかく、Rubyのライブラリ作者は、catch, throwするときにはドキュメントに書きましょう。もちろん、例外も。