例如,php 有类似 InvalidArgumentException 的异常,带有自定义消息“未找到当前组”。
我可以在代码中抛出这个异常。
if ($groupId === 0) {
throw new InvalidArgumentException('Current group not found');
}
Run Code Online (Sandbox Code Playgroud)
我可以继承这个异常并创建另一个子异常。
Perl 中的异常是如何工作的?
有多种方法可以做到这一点,但它们并没有直接内置到 Perl 中。
最简单的一种是die
和eval {}
抓住它。
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)