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

如何在Perl中创建和抛出异常?,perl,exception,Perl,Exception,例如,php有类似InvalidArgumentException的异常,自定义消息为“未找到当前组” 我可以在代码中抛出这个异常 if($groupId==0){ 抛出新的InvalidArgumentException(“未找到当前组”); } 我可以继承此异常并创建另一个子异常 异常在Perl中是如何工作的?有多种方法可以做到这一点,但它们不是直接内置到Perl中的 最简单的一种方法是去死,然后eval{}抓住它 eval{ 死于“火灾”; }; 如果($@){ 打印“出了问题”; }

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

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

if($groupId==0){
抛出新的InvalidArgumentException(“未找到当前组”);
}
我可以继承此异常并创建另一个子异常


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

有多种方法可以做到这一点,但它们不是直接内置到Perl中的

最简单的一种方法是去死,然后
eval{}
抓住它

eval{
死于“火灾”;
};
如果($@){
打印“出了问题”;
}
如果您想
试试
,同样有各种选项。最常见的是

使用Try::Tiny;
试一试{
死亡
}抓住{
打印美元;
};
如果你想成为最前沿的,Paul Evans做了一项研究,在Perl代码中加入一个实际的关键字
try
。他已经发布了这个as的原型,并在最近进行了各种各样的讨论,包括2021年在Fosdem的讨论

现在,对于实际的异常,有几种方法可以做到这一点,这是Perl的典型做法

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

这可能是我今天想要的。您可以轻松地在运行中使用创建大量此类

使用一次性::工厂
InvalidArgumentException=>[qw($id)];
sub-foo{
我的$group\u id=班次;
除非($group\U id){
InvalidArgumentException->throw('未找到当前组',id=>$group\U id);
}
}
稍后要了解这一点,您可以:

使用Try::Tiny;
试一试{
foo(0);
}抓住{
警告$\;
};
我喜欢使用JT Smith的模块,尤其是web应用程序。这个例子结合了Ouch和TryTiny

use Ouch;
use Try::Tiny;
sub ProcessFiles {    die "Help, help, I'm being repressed";    }

sub DoLotsOfStuff {
    try {
        ProcessFiles();
    } catch {
        ouch 'That module/sub gave me an err', "died: $_";
    };
}
sub Driver {
    try {
        DoLotsOfStuff();
    } catch {
        if (hug($_)) {
            ouch 404, "Driver: $_"; # the caller wants a numeric code
        }
    }
}

try {
    Driver();
} catch {
    if (kiss(404,$_)) {
        ouch 404, "CallAPI: $_";
    }
}

如果在导入Ouch时通过选项
:trytyny\u var
,则可以避免对
$\u
的所有特定引用(例如在
拥抱
亲吻
)。此外,我坚持使用整数错误代码作为
ouch
的第一个参数,尽管这是个人喜好的问题。