アップデート
匿名ユーザーのおかげで、回答のバグを修正できました。return
ブロック内のは、サブルーチンcatch
からのみ返されるため、目的の効果がありませんでした。catch
例外がなかった場合はブロックtry
の値を返しtry
、それ以外の場合はブロックの値を返しますcatch
。したがって、このバージョンは正しく実行され、 が成功した$c->redirect("/index")
場合はの値を返し、それ以外の場合は を呼び出して の値を返します。insert
$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::Tiny
一般的なケースでエラー処理をeval
正しく行うのは非常に難しいため、これは非常に重要です。モジュールのドキュメントにはこう書かれています
このモジュールは、eval ブロックでよくある間違いを最小限に抑えるように設計された、最低限の try/catch/finally ステートメントを提供します。
このモジュールの主な焦点は、毎回 5 行のボイラープレートなしで正しい eval ブロックを書きたいと考えている人のために、シンプルで信頼性の高いエラー処理を提供することです。
あなたのコードは次のようになります
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 つです。
try
言語の単語のように見えるようにコード化されたcatch
サブルーチンです。つまり、最後の右中括弧の後のセミコロンは必須です。
同じ理由で、 orブロックreturn
内では期待どおりに動作せず、単純にブロックを終了して親サブルーチンに戻ります。上記の私の更新を参照してください。try
catch
catch
ブロック内には、 の$@
前の元の値がありtry
ます。エラーの結果の値は$_