更新
感謝匿名用戶我已經能夠糾正的錯誤在我的答案。 catch
塊中的return
沒有達到預期的效果,因爲它僅從catch
子例程返回。
如果沒有異常,則try
返回try
塊的值,否則返回catch
塊的值。因此,如果insert
成功,則此版本正確執行並返回$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::Tiny
是非常必要的,因爲誤差eval
處理是很艱難的,以得到正確的一般情況。該模塊的文檔說這個
該模塊提供了裸體骨架try/catch/finally語句,旨在最大限度地減少與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");
}
,我希望你會同意是更好。
有兩點值得注意:
try
和catch
是子程序編碼看起來像語言的話。這意味着最後一個右大括號後面的分號是必不可少的。如預期
出於同樣的原因,return
的try
或catch
塊內將無法正常工作,並會簡單地退出塊,返回到父子程序。看到我上面的更新。
在catch
區塊[email protected]
的原始值爲try
之前。從錯誤中得到的值是$_
確實好多了 – ado
匿名用戶沒有足夠的聲望發表評論,試圖編輯我的答案,添加此文本。這是一個很好的觀點,我做了一個適當的更新。 *通過'Try :: Tiny',建設更好,但與原來的帖子大不相同。正如你所寫的,try和catch塊是子例程,因此catch內部的返回僅從匿名sub中返回,而不是從'insert_exec'中返回。這意味着在發生異常的情況下也執行重定向。這是'Try :: Tiny'的常見錯誤。* – Borodin