例外をめぐる雑談

kusigahama: エラーを「返す」の禁止にしたい
kusigahama: 正常終了以外するな!
fuktommy: 例外禁止コーディングルールってどっかで見たことあったり。
kusigahama: 例外以外のエラー処理を禁止しましょう
kusigahama: そういえば関数型言語って例外的状況はどう処理するんだろう
fuktommy: なぜ例外を使ってはいけないのかという、設計論だったのだけど、どういう理屈なのか忘れてしましました。
kusigahama: 例外を投げずに済むならその方が綺麗な気はするが
kusigahama: 把握しやすいコードを書くにあたってどういう考え方をするか、かなー
fuktommy: これかな。例外使うなとは書いてない。記憶の中でごっちゃになったかも。 http://d.hatena.ne.jp/bleis-tift/20090809/1249825777
fukken: PHPはset_error_handler()でエラー発生をキャッチして例外をぶん投げる、という手で一応対応可能。
fukken: http://jp2.php.net/manual/ja/class.errorexception.php
fuktommy: set_error_handler() つかうとなぜかセグフォった。(某開発鯖)
kusigahama: ブラックボックスの扱い方ではなくてコードの書き方の話なのでそれはちょっと
kusigahama: コーディング規約の話かな
kusigahama: >非 public な関数に関してはアサーションを使い、「成果物に取って外界とのインターフェイスとなる部分」、つまり public な関数の入力チェックには例外を使う
kusigahama: LLだとアサーションも例外扱いな印象
fuktommy: 最近書くコードだと、戻値がオブジェクトになっていて、$hoge->success, $hoge->error, $hoge->errorMessage みたいなのが入っていることがあったりします。
kusigahama: 例外がサポートされてなかったりするんですか、それは
kusigahama: バグはバグという例外でよさげ 動的にしか捕まえられないものであるなら。
fuktommy: 例外じゃないんですよね。タスクキューが一杯だから積めなかったとか、そういう系。
kusigahama: タスクを追加する関数で、その唯一のエラーがタスクを詰めないこと、みたいな感じですかしら
fuktommy: DBに接続できなかったとかは例外で、タスクを積めるか積めないかは状況次第だから例外にはしないというような、なんでしたっけ、そういう設計方針があったような。
kusigahama: 「想定される全シチュエーションにおいて、失敗時には必ず呼び出し元で何かしらの処理を行うべきであり、絶対に大域脱出すべきでない」というものでなければ、例外の方がいい気がする
eguchi: 『絶対』がコミット時レベルで自動でチェックできないと3世代位で破綻しそう
fuktommy: もうちょっとカジュアルに使っちゃっていいんですかね。例外を投げるのは控えろみたいな文章を昔読んだので、それに従っているのですが、もう古いのかな。
kusigahama: LLだったらカジュアルで良いと思います
kusigahama: 失敗処理をし損ねた場合に、上位層で手がかりがつかめる のが例外の有いところで
fuktommy: うーん。でもLLって検査例外ってなかったりして、最上位のcatchまで駈け登ったという障害を出したことが…
kusigahama: せっかく言語レベルでサポートされるエラー処理システムがあるのに、毎度毎度自前で書かなくても良いんではないか、という感じ
kusigahama: もし例外じゃなかったら、駆け上らずに済むわけではないですよね
fuktommy: キューに積めないのは単にキューが一杯だからであって、エラーじゃないんですよね。僕的には。
fuktommy: いや、例外じゃなくれば、単にテンプレートに入れる変数の1つがnullか何かになるだけなんですが、
fuktommy: try-catch を書き忘れていたという。
kusigahama: それはそれで、補足できてないのはまずいような。
fukken: ひとつの指針は、DB障害のような想定できないエラーと、指定されたIDの動画がなかった、というような普通に起きるエラーは別に分ける
kusigahama: 戻り値のチェックをやめて、代わりに適切な場所でtry-catchする、でいいように思います。
kusigahama: 普通に起きるエラー」
fukken: もうひとつは、エラーが起きた時にリトライするのか、エラーを無視して処理を進めるのか、エラーが出た時点で手遅れなので500エラー確定か
kusigahama: とりあえず「例外」って名前は忘れて、単に機構として考えたほうがいいと思います
kusigahama: 致命的なのは最上段まで駆け上らせて(DBErrorとか)、テンプレートに空欄を出すレベルのはArgumentErrorやら何やら、って投げ分けるのがいいんじゃないかなー
kusigahama: エラーをどこで補足するかを使われる側で縛るべきじゃないと思うんですよね
kusigahama: 戻り値は直上で補足せざるを得ない
fuktommy: sum = add(a, b) は意味が通るけど、 success = taskQueue.push(newTask) はおかしいと言えるから、確かに例外がいいのかも。
fuktommy: あとはtry-catch忘れさえなければ…
kuzuha: void taskQueue.push(new Task)
kuzuha: throws は確かに便利ではある
eguchi: 例外処理は使う人の人間性が問われる
kusigahama: 「エラー処理がないのはおかしい」というチェック能力を、戻り値ではなくどこで例外を捕まえてるかに向けて、新しい人生を拓きましょう
kusigahama: 検査例外は安心感はあるけどつらい...