更新
感谢一位匿名用户,我已经能够纠正我的答案中的错误。return
块中的catch
没有达到预期的效果,因为它仅从catch
子例程返回。
如果没有异常,则try
返回try
块的值,否则返回块的值catch
。所以这个版本正确执行并返回$c->redirect("/index")
ifinsert
成功的值,否则它调用并返回 的值$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 块的常见错误,而不是其他任何东西。
该模块的主要重点是为那些仍然想编写正确的 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
orcatch
块内将不会按预期工作,并且将简单地退出块,返回父子程序。请参阅上面的更新。
catch
块内$@
有它之前的原始值try
。错误产生的值在$_