尝试在Perl中使用Catch而不使用外部库

5f0d552i  于 2023-01-13  发布在  Perl
关注(0)|答案(2)|浏览(150)

我正在从Java代码生成Perl代码,并尝试模拟trycatch机制。我不能使用外部库。我发现了两种可能的方法来模拟这种行为:
第一个:

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

第二:

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

我对Perl的了解很少。据我所知,第一种解决方案使我能够执行多个命令,而第二种解决方案使我只能执行一个命令。但是,我也看到不推荐使用eval。
做这件事的"正确"方法是什么?

gg0vcinb

gg0vcinb1#

你的第二个代码段根本不会捕捉异常,所以它不是一个选项。你在core[1]中的选项是:
1.

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

缺点(第二个版本):在Python 5.14之前,如果一个对象析构函数crobbers $@,异常可能会被忽略。
在核心之外,

  1. TryCatch
use TryCatch;

try {
   f();
} catch($e) {
   warn($e);
}
  1. Nice::Try
use Nice::Try;

try {
   f();
} catch($e) {
   warn($e);
}
  1. Try::Tiny
use Try::Tiny;

my $rv = try {
   f();
} catch {
   warn($_);
};

(Try::Tiny版本的)缺点:这些块是伪装的潜艇,所以你不能在里面使用return
可能还有其他人。
1.这是一个愚蠢的要求。许多有用的工具在core中是不可用的,并且core中可用的模块不一定是最好的,甚至不推荐。

hujrc8aj

hujrc8aj2#

Eval是我们在工作中使用的典型方法,但是Try::Tiny是一个相当小的模块,使用起来很简单,但是,既然你不想使用任何外部模块。
unless并不是一个可行的选择,因为它不会捕获diecroak的代码片段,所以您只能使用eval

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

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

相关问题