2

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

如果有帮助,我会用它Moose来构建我的课程

4

2 回答 2

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似乎几乎将所有事情都委托给了Fatal,所以看起来那些实际上没有做的事情autodie仍然FatalFatal...

于 2011-05-14T21:26:19.833 回答
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在代码中使用(具有词法范围),但每当它抛出异常时,它都会创建并抛出一个对象 frommy::exception::class而不是 from autodie::exception。这对于您想要的东西来说可能是多余的,但是如果您想扩展autodie异常以提供堆栈回溯、本地化或其他功能,它会非常方便。

于 2011-05-20T16:34:14.580 回答