在不使用外部库的情况下尝试在Perl中捕获
我正在从Java代码生成一个Perl代码,并尝试模拟在不使用外部库的情况下尝试在Perl中捕获,perl,error-handling,try-catch,Perl,Error Handling,Try Catch,我正在从Java代码生成一个Perl代码,并尝试模拟trycatch机制。 我不能使用外部库。我找到了两种可能的方法来模拟这种行为: 第一个: eval { ... }; if ($@) { errorHandler($@); } 第二: unless(.....){ // handle the error } 我对Perl的了解很少。据我所知,第一种解决方案使我能够执行多个命令,而第二种解决方案使我能够只执行一个命令。 但是,我也看到不推荐使用eval “正确”
try
catch
机制。
我不能使用外部库。我找到了两种可能的方法来模拟这种行为:
第一个:
eval {
...
};
if ($@) {
errorHandler($@);
}
第二:
unless(.....){
// handle the error
}
我对Perl的了解很少。据我所知,第一种解决方案使我能够执行多个命令,而第二种解决方案使我能够只执行一个命令。
但是,我也看到不推荐使用eval
“正确”的方法是什么?Eval是我们在工作中使用的典型方法,但它是一个相当小的模块,使用简单。但是,因为您不想使用任何外部模块
除非
不是一个真正可行的选项,因为它不会捕获死亡
或发出嘎嘎声
的代码片段。所以剩下的是eval
# named special variables
use English qw(-no_match_vars);
eval {
# try
};
if ($EVAL_ERROR) {
# catch
}
您的第二个代码段根本没有捕获异常,因此它不是一个选项。您在core[1]中的选择是:
$@
,则异常可能会被忽略
使用TryCatch;
试一试{
f();
}捕获量(e美元){
警告(e美元);
}
使用Nice::Try;
试一试{
f();
}捕获量(e美元){
警告(e美元);
}
使用Try::Tiny;
我的$rv=试试看{
f();
}抓住{
警告(美元);
};
缺点:这些块是伪装的子块,因此不能从它们内部使用return
为什么不能使用模块?我正在为许多客户机生成代码,我不想强迫他们使用外部模块。eval有两种形式;一个获取一个perl代码字符串并编译和运行它,另一个(您展示的那个)运行一个代码块并捕获异常。不推荐使用前者(除非在受信任的字符串上),而不是后者。相关的perlcritic策略:具有大量依赖项的小模块我更喜欢
eval{…;1;}或do{}代码>模式,因为它将焦点放在代码上而不是错误处理上。eval{…;1;}或return代码>,当然,但是或do{}
是相当令人担忧的。作为任何感兴趣的人的参考,还有另一个perl模块,它的行为与其他语言中的try-catch完全相同,它是。为了充分披露,我在TryCatch因新版本的Devel停止工作时开发了该模块:Declare@Jacques补充。
my $rv;
if (!eval { $rv = f(); 1 } ) {
warn($@);
}
my $rv = eval { f() };
if ($@) {
warn($@);
}