Perl:对未定义的 "can' t 调用方法强制堆栈跟踪"

arxive 阅读:68 2024-05-29 10:23:45 评论:0

我使用 Perl 和 Catalyst 作为 Web 框架。

如果抛出类似 Can't call method "XXX"on an undefined value... 之类的异常,我如何全局强制执行堆栈跟踪?

假设您的 Controller/Root.pm

中有以下代码
use DateTime; 
 
sub test  :Local :Args(0) { 
    my ( $self, $c ) = @_; 
    my $now = DateTime->now(time_zone=>'local'); 
    my $tmp = undef; 
 
    my $throwing = $tmp - $now; #this will throw an exception! 
    $c->res->body("OK"); 
} 

打开 http://localhost:3000/test 当然会抛出异常:

Caught exception in MyApp::Controller::Root->test "Can't call method "subtract_datetime" on an undefined value at /usr/local/lib/perl/5.10.1/DateTime.pm line 1619, line 1003."

堆栈跟踪丢失!

在这种情况下如何强制执行堆栈跟踪?

即我想得到(不是真正的输出,只能手工组成):

MyApp::Controller::Root::__ANON__('Can\'t call method "subtract_datetime" on an undefined value at /usr/local/lib/perl/5.10.1/DateTime.pm line 1619, <DATA> line 1003.^J') called at /home/user/MyApp/script/../lib/MyApp/Controller/Root.pm line 114 
MyApp::Controller::Root::test('MyApp::Controller::Root=HASH(0x20583b60)', 'MyApp=HASH(0x206e9140)') called at /usr/local/share/perl/5.10.1/Catalyst/Action.pm line 65 
Catalyst::Action::execute('Catalyst::Action=HASH(0x20668e88)', 'MyApp::Controller::Root=HASH(0x20583b60)', 'MyApp=HASH(0x206e9140)') called at /usr/local/share/perl/5.10.1/Catalyst.pm line 1687 
eval {...} at /usr/local/share/perl/5.10.1/Catalyst.pm line 1687 
Catalyst::execute('MyApp=HASH(0x206e9140)', 'MyApp::Controller::Root', 'Catalyst::Action=HASH(0x20668e88)') called at /usr/local/share/perl/5.10.1/Catalyst/Action.pm line 60 
[ and the rest of the exception ...] 

这样我就知道异常是由 Root.pm 中的第 114 行引起的

请您参考如下方法:

我不确定它是否在 Catalyst 中工作,但通常您可以通过包含 CPAN 模块 Carp::Always 来强制堆栈跟踪,例如通过在程序中的某处编写 use Carp::Always; 或使用 -MCarp::Always 开关启动 perl 脚本。


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号