perl – 如果AUTOLOAD失败,则传递错误消息

perl – 如果AUTOLOAD失败,则传递错误消息,第1张

概述我正在使用AUTOLOAD来处理对某些未定义子例程的调用. sub AUTOLOAD { my $member = $AUTOLOAD; # ... do something if knowing how to handle '$member' # otherwise ?} 在包上调用一个不存在的子例程(比如my_method)时,Perl通常会说类似的 我正在使用autoLOAD来处理对某些未定义子例程的调用.

sub autoLOAD {    my $member = $autoLOAD;    # ... do something if kNowing how to handle '$member'            # otherwise ?}

在包上调用一个不存在的子例程(比如my_method)时,Perl通常会说类似的东西

Can't locate object method "my_method" via package "MyPackage" at Package.pm line 99.

我希望Perl显示此标准消息,以防我不知道如何在我的autoLOAD实现中处理对子例程$member的调用.

我怎样才能做到这一点?

我发现没有可能包含相应消息的特殊变量.此外,Perl documentation on Autoloading没有提供此问题的提示.

备注:我想避免重写错误消息,而是使用Perl提供的标准消息.

解决方法 不幸的是,你做不到. Perl首先尝试在包中找到一个方法,然后在@ISA中找到它的父包,最后是UNIVERSAL.接下来,它会重复该过程,但会搜索autoLOAD以代替方法名称. perl的唯一方法是在调用时引发异常,如果找不到方法的话.如果perl调用了你的autoLOAD子程序,它已经超出了定位方法的位置,它只能在autoLOAD的堆栈框架内死掉.

如果您绝对需要在调用方法的地方死亡,那么您唯一的选择就是避免使用autoLOAD并定义所有方法.

但是,如果只是为了外观,这将伪造它:

sub autoLOAD {    my ($package,$method) = $autoLOAD =~ /^(.*)::([^:]*)/;    dIE sprintf(qq{Can't locate object method "%s" via package "%s" at %s line %d.\n},$method,$package,(caller)[1,2]);}
总结

以上是内存溢出为你收集整理的perl – 如果AUTOLOAD失败,则传递错误消息全部内容,希望文章能够帮你解决perl – 如果AUTOLOAD失败,则传递错误消息所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1245090.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存