p_chinのおっぱいブログ

UnityとPerlなど

エラーのハンドリングはコントローラーで

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 errorthrowする前にwarn$_の中身を出力する方法もあるが、せっかくコントローラにエラー情報を渡すのだし、コントローラ内でクライアントに必要の無いエラーの切り捨て作業を行えば良いらしい

 

まとめ

Try::Tinyの中、行数短いし見てみなよ^^と言われたけど、ちょっとよく分からなかった。