如何在 Perl 中创建和抛出异常?

Gre*_*oev 3 perl exception

例如,php 有类似 InvalidArgumentException 的异常,带有自定义消息“未找到当前组”。

我可以在代码中抛出这个异常。

if ($groupId === 0) {
    throw new InvalidArgumentException('Current group not found');
}
Run Code Online (Sandbox Code Playgroud)

我可以继承这个异常并创建另一个子异常。

Perl 中的异常是如何工作的?

sim*_*que 5

有多种方法可以做到这一点,但它们并没有直接内置到 Perl 中。

最简单的一种是dieeval {}抓住它。

eval {
  die "in a fire";
};
if ($@) {
  print "something went wrong";
}
Run Code Online (Sandbox Code Playgroud)

如果你愿意try,同样有各种选择。最常见的是Try::Tiny

use Try::Tiny;

try {
  die;
} catch {
  print $_;
};
Run Code Online (Sandbox Code Playgroud)

如果您想成为最前沿的人,Paul Evans 进行了一项研究,将实际的关键字添加try到 Perl 代码中。他发布了一个原型作为Syntax::Keyword::Try,并在最近进行了各种讨论,包括在 2021 年的 Fosdem。

现在对于实际的异常,正如 Perl 所特有的那样,有几种方法可以做到这一点。

die 可以将对象作为其参数而不仅仅是字符串,因此您几乎可以模拟其他语言的行为。

Throwable可能是我今天要做的。您可以使用Throwable::Factory轻松地动态创建许多此类类。

use Throwable::Factory
  InvalidArgumentException => [qw( $id )];

sub foo {
  my $group_id = shift;
  unless ($group_id) {
    InvalidArgumentException->throw('Current group not found', id => $group_id);
  }
}
Run Code Online (Sandbox Code Playgroud)

稍后要抓住这一点,您可以执行以下操作:

use Try::Tiny;

try {
  foo(0);
} catch {
  warn $_;
};
Run Code Online (Sandbox Code Playgroud)