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

标签 perl exception

例如,php 有像 InvalidArgumentException 这样的异常,带有自定义消息“找不到当前组”。
我可以在代码中抛出这个异常。

if ($groupId === 0) {
    throw new InvalidArgumentException('Current group not found');
}
我可以继承这个异常并创建另一个子异常。
Perl 中的异常是如何工作的?

最佳答案

有多种方法可以做到这一点,但它们不是直接内置在 Perl 中的。
最简单的就是dieeval {}捕获它。

eval {
  die "in a fire";
};
if ($@) {
  print "something went wrong";
}
如果你想要try ,同样有多种选择。最常见的是Try::Tiny .
use Try::Tiny;

try {
  die;
} catch {
  print $_;
};
如果你想成为最前沿的人,Paul Evans 进行了一项研究,以获得一个实际的关键字 try进入 Perl 代码。他发布了一个原型(prototype)为Syntax::Keyword::Try并在最近进行了各种讨论,包括 2021 年的 Fosdem。
现在对于实际的异常(exception)情况,有几种典型的 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);
  }
}
稍后要捕获它,您可以执行以下操作:
use Try::Tiny;

try {
  foo(0);
} catch {
  warn $_;
};

关于perl - 如何在 Perl 中创建和抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66831985/

相关文章:

perl - 如何在 Perl 中有效地解析 CSV 文件?

html - 如何使用 Web::Scraper 解析此 HTML?

java - java中从Exception类抛出异常

java - IndexOutOfBounds 与索引 14,大小 16。如何?

perl - 如何在 Perl 中以 DDMMYY 格式获取文件的修改日期?

perl - 如何删除模板工具包中的变量?

perl - 无法通过包 "new"找到对象方法 "www::Mechanize"(也许您忘记加载 "www::Mechanize"?)在 gmail.pl 第 9 行,<stdin> 第 2 行

exception - Project Rider - 异常中断

Java 线程 : Run method cannot throw checked exception

c++ - gcc 内联 asm 跳转到带有交叉抛出异常的标签