2013-08-02 13 views
7

どちらが安全です&良い&クリーナー&をお勧めしますか?Try :: TinyまたはEvalを使用していますか?

私が使用:

sub insert_exec { 
    my ($self, $c, $args) = @_; 
    my ($params, $table, $model) = $self->_init({context => $c, args => $args}); 
    eval { $model->insert($table, $params); 
    }; 
    if ([email protected]) { return $c->show_error([email protected]); } ## error 
    $c->redirect("/index"); 
} 

しかし、例、この種のために(エラー部分を参照)、私が試し::タイニーを使用して優れていると言われていますか?

私の質問は次のとおりです。これをどのように書きますか?その方法を選択する理由は何ですか?

答えて

10

更新

感謝。 catchブロックのreturnは、catchサブルーチンからのみ返されたため、目的の効果がありませんでした。

例外がない場合、trytryブロックの値を返します。それ以外の場合はcatchブロックの値を返します。したがって、このバージョンは正しく実行され、が成功した場合は$c->redirect("/index")の値を返し、それ以外の場合は$c->show_error($_)の値を呼び出して返します。

sub insert_exec { 
    my ($self, $c, $args) = @_; 
    my ($params, $table, $model) = $self->_init({context => $c, args => $args}); 
    try { 
    $model->insert($table, $params); 
    $c->redirect("/index"); 
    } 
    catch { 
    $c->show_error($_); 
    }; 
} 

Try::Tinyevalでエラー処理が右の一般的なケースでは得ることが確かに非常に困難であるとして、ほとんど不可欠です。モジュールのマニュアルは、この

このモジュールは、裸の骨がevalのブロックと共通のミスを最小限に抑えるように設計されていない、と何もされている/キャッチ/最後に文を試す提供言います。

このモジュールの主な焦点は、毎回5行の定型句を使わずに正当な評価ブロックを書きたい人にとって、簡単で信頼性の高いエラー処理を提供することです。あなたのコードは、私はあなたが非常に良くあることに同意いただければ幸いです。この

use Try::Tiny; 

sub insert_exec { 
    my ($self, $c, $args) = @_; 
    my ($params, $table, $model) = $self->_init({context => $c, args => $args}); 
    try { 
    $model->insert($table, $params); 
    } 
    catch { 
    return $c->show_error($_); 
    }; 
    $c->redirect("/index"); 
} 

ようになり

2点が注目される:

  • trycatchは、言語の単語のように見えるようにコード化されたサブルーチンです。これは、最後の閉じ括弧が必須である後のセミコロンを意味します。tryまたはcatchブロック内の同じ理由

  • returnは期待通りに動作しませんし、単に親サブルーチンに戻って、ブロックを終了します。上記の私の更新を参照してください。

  • catchブロック内[email protected]は、tryより前の元の値を持ちます。エラーからの結果の値が$_

+0

本当にうれしいです – ado

+0

コメントを投稿する評判が不十分だった*匿名のユーザー*は、自分の回答を編集してこのテキストを追加しようとしました。非常に良い点であり、私は適切な更新を行った。 * 'Try :: Tiny'では構造がより良くなりますが、元の投稿とは大きく異なります。あなたが書いたように、catchブロックはサブルーチンであるため、catch内の戻り値は 'insert_exec'からではなく、匿名サブからのみ返ります。これは、リダイレクトが例外の場合にも実行されることを意味します。これは 'Try :: Tiny'の共通の落とし穴です。* – Borodin

4

Try::Tinyを使用しないと、追加の依存関係が保存されます。

Perlのイディオムを理解することなく理解できるコードを書くことができます(業界全体でより一般的に認められている用語に置き換えて)。

これらのうちどれがあなたにとって価値があるかを判断する必要があります。客観的に相対価値を測定するのは難しいからです。私は私の答えのバグを修正することができました匿名ユーザーに

1

であることは、エラーを通知するために[email protected]に依存しないことが最善ですが、ちょうどエラーメッセージのソースとして使用するので、私はとしてそれを記述します。

my $success = eval { $model->insert($table, $params) }; 
unless ($success) { 
    return $c->show_error([email protected]); 
} 

あなたはその後、成功に真の値が返されない場合があります何かをeval'ingしている場合:

my $success = eval { $model->insert($table, $params); 1 }; 

を私はおそらく試し使用する::小さな物事がより複雑に取得するときたとえば、関数は保存したい値を返しますが、真の値ではない(または定義されていない可能性もあります)場合があり、例外をキャッチしたい場合などです。

関連する問題