在不使用外部库的情况下尝试在Perl中捕获

在不使用外部库的情况下尝试在Perl中捕获,perl,error-handling,try-catch,Perl,Error Handling,Try Catch,我正在从Java代码生成一个Perl代码,并尝试模拟trycatch机制。 我不能使用外部库。我找到了两种可能的方法来模拟这种行为: 第一个: eval { ... }; if ($@) { errorHandler($@); } 第二: unless(.....){ // handle the error } 我对Perl的了解很少。据我所知,第一种解决方案使我能够执行多个命令,而第二种解决方案使我能够只执行一个命令。 但是,我也看到不推荐使用eval “正确”

我正在从Java代码生成一个Perl代码,并尝试模拟
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]中的选择是:

  • 缺点:在5.14之前,如果对象析构函数阻塞
    $@
    ,则异常可能会被忽略

  • 在核心之外

  • 使用TryCatch;
    试一试{
    f();
    }捕获量(e美元){
    警告(e美元);
    }
    
  • 使用Nice::Try;
    试一试{
    f();
    }捕获量(e美元){
    警告(e美元);
    }
    
  • 使用Try::Tiny;
    我的$rv=试试看{
    f();
    }抓住{
    警告(美元);
    };
    
    缺点:这些块是伪装的子块,因此不能从它们内部使用
    return

  • 可能还有其他人


  • 愚蠢的要求。许多有用的工具在core中都不可用,core中可用的模块也不一定是最好的,甚至不是推荐的

  • 为什么不能使用模块?我正在为许多客户机生成代码,我不想强迫他们使用外部模块。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($@);
     }