像autodie一样死去

时间:2011-05-14 18:56:39

标签: perl methods autodie

我使用autodie来处理内置插件的异常。不幸的是,它的范围是词汇,autodie不适用于方法。是否可以从我的类方法中抛出异常,以便以与autodie异常相同的方式处理它们。简而言之,我不希望我的类的用户以两种方式处理异常 - 一种具有autodie为内置函数提供的丰富异常类,另一种用于我的代码抛出的简单“die if ...”。

如果有帮助,我使用Moose来构建我的类

2 个答案:

答案 0 :(得分:2)

查看autodie来源,我看到它死了:

    Carp::croak sprintf(
        ERROR_WRONG_FATAL, $Fatal::VERSION, $VERSION, $autodie_path
    );

如果您从代码中执行相同操作,我希望调用代码能够收到相同的内容。

修改:正如对此答案的评论所指出的,autodie实际上已在Fatal内死亡。查看Fatal来源的五分钟未能看出死亡的方式/地点,大多只是让我对这两个模块之间的关系感到困惑。[1]

除非您想深入了解Fatal来源,否则您的下一个选择是定义autodie例外的哪些功能对您很重要并复制它们。从这个问题来看,听起来这可能就像识别autodie使用的异常类并抛出同一类的异常对象一样简单。

[1] Fatal有很多“使用autodie而不是因为它做了Fatal没有做的事情”评论,但autodie似乎将所有内容委托给Fatalautodie Fatal实际上完成Fatal {{1}}实际上完成的事情{{1}}似乎...

答案 1 :(得分:2)

如果您希望您的例外与autodie中的例外一样,那么我可以考虑两个选项:

使用或继承autodie::exception类。

这非常简单,只需perldoc autodie::exception并记下创建新对象时需要的参数。您可能会发现从autodie::exception继承可以为您提供更多的灵活性或功能,在这种情况下您应该这样做。

告诉autodie使用您自己的异常类。

这有点棘手,但并不难:

# Inside my/autodie.pm

pacakge my::autodie;
use parent 'autodie';

sub exception_class { return 'my::exception::class'; }

1;

然后,您可以在代码中使用my::autodie(使用词法范围),但每当它抛出异常时,它都会创建并从my::exception::class而不是autodie::exception中抛出一个对象。这对你想要的东西来说可能有点过头了,但是如果你想扩展autodie的例外以提供堆栈回溯,本地化或其他功能,它会非常方便。