加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Perl中捕获并重新抛出错误?

发布时间:2020-12-16 06:18:14 所属栏目:大数据 来源:网络整理
导读:假设我有一个模块Bar,它是模块Foo的子类包装器.我希望调用Bar的方法来模仿Foo – 甚至是致命的错误.到目前为止,很容易;我只是称之为SUPER方法. sub stuff { # Do stuff here SUPER::stuff(@_); # Do more stuff here} 但是,让我们说我想抓住,记录并重新抛出S
假设我有一个模块Bar,它是模块Foo的子类包装器.我希望调用Bar的方法来模仿Foo – 甚至是致命的错误.到目前为止,很容易;我只是称之为SUPER方法.

sub stuff {
    # Do stuff here

    SUPER::stuff(@_);

    # Do more stuff here
}

但是,让我们说我想抓住,记录并重新抛出SUPER :: stuff()产生的任何致命错误.前两个步骤很简单:

sub stuff {
    # Do stuff here

    eval {
        SUPER::stuff(@_);
    };
    $@ and log("Naughty,naughty: $@");

    # Do more stuff here
}

……但我不知道怎么做最后一部分.如何重新抛出错误,使得调用者无法区分对Foo-> stuff()的调用和对Bar-> stuff()的调用?我可以在日志语句之后插入$@并期望它做我想要的,或者这里有细微差别可能会让我遇到麻烦吗?

解决方法

在Perl中安全地eval / catch / log / rethrow的完整代码可能有点冗长.

sub stuff {
    # Do stuff here

    local $@; # don't reset $@ for our caller.
    my $eval_ok = eval { # get the return from eval,it will be undef if the eval catches an error.
        SUPER::stuff(@_);
        1; # return 1 (true) if there are no errors caught.
    };
    if (!$eval_ok) { # don't trust $@ it might have been reset as the eval unrolled.
        my $error = $@ || 'unknown error'; # copy $@ incase write_log resets $@,or is later changed to cause it to reset $@.
        write_log("Naughty,naughty: $error");
        die $error; # after all that we can rethrow our error.
    }

    # Do more stuff here
}

你可以使用暴徒的Try::Tiny sugested来简化:

sub stuff {
    # Do stuff here

    try {
        SUPER::stuff(@_);
    } catch {
        my $error = $_;
        write_log("Naughty,naughty: $error");
        die $error;
    }

    # Do more stuff here
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读