keitaの日記: OCamlのexceptionを考える
日記 by
keita
とりあえず OUnit の作者さんに assert_exception を提案してみました。
こんなの。
let assert_exception msg expected_exn (f : unit -> 'a) =
try
f (); assert_failure msg
with
| e -> if expected_exn = e then () else assert_failure msg
で、思ったんだけど、OCamlの例外ってコンストラクタだけじゃなくって
文字列の方まで一致してないと同じ例外だって看倣されないんですよね。
ついつい Ruby の感覚で、えー、コンストラクタだけ一致してりゃいいじゃん、
って思っちゃうんですけれども。
Ruby だと例外はオブジェクトであくまでもそれが持つ文字列って
おまけ程度だからクラスが一致してりゃ同じ種類の例外であると
考えてもいいわけだろうし、メッセージが違うから違う種の例外だなんて考えない。
一方でOCamlではあくまでコンストラクタの後に続く文字列が
例外の実際的な内容だってことなんでしょうか。
でも正直これだと例外をきちんと捕捉しなかった場合のエラーメッセージが
あまりに簡素でワケ分かんない場合が多いようにも思います。
いや、まぁ、ちゃんと例外処理しないヤツが悪いんだけど。
んー、でもなんか変かも。
自分はコンストラクタがまだ馴染めてないのかな。
って、assert_exception、ホントにこれでいいのか?
だいたい問題なく動作はしそうだけれども、
expected_exn が OUnit.Failure msg と等しい場合には
うまくいかないんじゃないのかな。
うひー、しまった、詰めが甘いじゃん!
こんなの。
let assert_exception msg expected_exn (f : unit -> 'a) =
try
f (); assert_failure msg
with
| e -> if expected_exn = e then () else assert_failure msg
で、思ったんだけど、OCamlの例外ってコンストラクタだけじゃなくって
文字列の方まで一致してないと同じ例外だって看倣されないんですよね。
ついつい Ruby の感覚で、えー、コンストラクタだけ一致してりゃいいじゃん、
って思っちゃうんですけれども。
Ruby だと例外はオブジェクトであくまでもそれが持つ文字列って
おまけ程度だからクラスが一致してりゃ同じ種類の例外であると
考えてもいいわけだろうし、メッセージが違うから違う種の例外だなんて考えない。
一方でOCamlではあくまでコンストラクタの後に続く文字列が
例外の実際的な内容だってことなんでしょうか。
でも正直これだと例外をきちんと捕捉しなかった場合のエラーメッセージが
あまりに簡素でワケ分かんない場合が多いようにも思います。
いや、まぁ、ちゃんと例外処理しないヤツが悪いんだけど。
んー、でもなんか変かも。
自分はコンストラクタがまだ馴染めてないのかな。
って、assert_exception、ホントにこれでいいのか?
だいたい問題なく動作はしそうだけれども、
expected_exn が OUnit.Failure msg と等しい場合には
うまくいかないんじゃないのかな。
うひー、しまった、詰めが甘いじゃん!
OCamlのexceptionを考える More ログイン