我autodie
用来处理内置程序的异常。不幸的是,它的范围是词法的, autodie
不适用于方法。是否可以从我的类方法中抛出异常,以便以与 autodie 异常相同的方式处理它们。简而言之,我不希望我的类的用户以两种方式处理异常——一种使用 autodie 为内置函数提供的丰富异常类,另一种用于die if ...
我的代码抛出的简单“”。
如果有帮助,我会用它Moose
来构建我的课程
查看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
仍然Fatal
由Fatal
...
如果您希望您的异常与 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
异常以提供堆栈回溯、本地化或其他功能,它会非常方便。