エラーのハンドリングはコントローラーで
MVCパターンを利用したフレームワークのArkとか使ってると、基本的にModelで出たエラーをControllerの、例えばhoge/errorというアクションに渡してクライアントにエラー文を送ったりする。
Modelでエラーを丸め込んで投げちゃうのは良くない
以下の様な感じ
use Try::Tiny; use Fugu::Exception; try { # some codes } catch { my $err = $_; if (!ref $err) { # 適当な条件(オブジェクトじゃなかったら) Fugu::Exception->throw($err) } # 以下が良くない else{ Fugu::Exception->throw('system error') } }
なんで?
モデルメソッドはバッチやツールスクリプトから直接呼び出す可能性が高いので、モデルでその他のエラーをsystem error
とかでthrow
しちゃうと、バッチスクリプトの実行時のエラーの詳細が分からなくて困る
system error
をthrow
する前にwarn
で$_
の中身を出力する方法もあるが、せっかくコントローラにエラー情報を渡すのだし、コントローラ内でクライアントに必要の無いエラーの切り捨て作業を行えば良いらしい
まとめ
Try::Tinyの中、行数短いし見てみなよ^^と言われたけど、ちょっとよく分からなかった。