我使用autodie
来处理内置插件的异常。不幸的是,它的范围是词汇,autodie
不适用于方法。是否可以从我的类方法中抛出异常,以便以与autodie异常相同的方式处理它们。简而言之,我不希望我的类的用户以两种方式处理异常 - 一种具有autodie为内置函数提供的丰富异常类,另一种用于我的代码抛出的简单“die if ...
”。
如果有帮助,我使用Moose
来构建我的类
答案 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
似乎将所有内容委托给Fatal
,autodie
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
的例外以提供堆栈回溯,本地化或其他功能,它会非常方便。