在没有外部库的情况下尝试在Perl中捕获

时间:2014-05-28 14:58:24

标签: perl error-handling try-catch

我正在从Java代码生成Perl代码,并尝试模拟try catch机制。 我不能使用外部库。我找到了两种可能的方法来模拟这种行为:

第一个:

eval {
     ...
};
if ($@) {
     errorHandler($@);
}

第二

unless(.....){
    // handle the error
}

我对Perl的了解很少。据我所知,第一个解决方案使我能够执行多个命令,而第二个解决方案使我只能执行1个命令。 但是,我也看到不推荐使用eval。

这样做的“正确”方法是什么?

2 个答案:

答案 0 :(得分:4)

你的第二个片段根本没有捕获异常,所以它不是一个选项。您在核心 [1] 中的选项是:

  1. my $rv;
    if (!eval { $rv = f(); 1 } ) {
       ...
    }
    
  2. my $rv = eval { f() };
    if ($@) {
       ...
    }
    

    下行:在5.14之前,如果对象析构函数崩溃$@,则不会注意到异常。

  3. 核心之外,

    1. TryCatch

      use TryCatch;
      
      try {
         f();
      } catch {
         ...
      }
      
    2. Try::Tiny

      use Try::Tiny;
      
      my $rv = try {
         f();
      } catch {
         ...
      };
      

      缺点:这些区块是伪装的,所以你不能在其中使用return

    3. 可能还有其他人。


      1. 一项愚蠢的要求。核心中没有许多有用的工具,核心中可用的模块不一定是最好的甚至是推荐的。

答案 1 :(得分:1)

Eval是我们在工作中使用的典型方法,但Try::Tiny是一个相当小的模块,使用起来很简单。但是,因为您不想使用任何外部模块。

unless实际上不是一个可行的选项,因为它不会捕获diecroak的代码片段。所以你留下了eval

# named special variables
use English qw(-no_match_vars); 

eval {
  # try
};
if ($EVAL_ERROR) {
  # catch
}