声明全局perl子例程或全局别名
我的问题很简单 在Perl中,如何创建一个全局作用域的子例程,此后所有对象都可以访问它声明全局perl子例程或全局别名,perl,oop,object,global,Perl,Oop,Object,Global,我的问题很简单 在Perl中,如何创建一个全局作用域的子例程,此后所有对象都可以访问它 sub throw { die(shift); } 似乎在全局范围内工作,但以后的包无法访问。我希望避免在我的应用程序堆栈中的每个对象中都声明这一点 侧面解决方案:如何为全局关键字(如die)创建别名 请注意:我真的不在乎这样做是否被视为最佳实践。虽然它们在Perl中执行相同的函数,但die不是throw,throw也不是die。以下语法没有遵循我试图遵循的OOP原则: die new Except
sub throw
{
die(shift);
}
似乎在全局范围内工作,但以后的包无法访问。我希望避免在我的应用程序堆栈中的每个对象中都声明这一点
侧面解决方案:如何为全局关键字(如die)创建别名
请注意:我真的不在乎这样做是否被视为最佳实践。虽然它们在Perl中执行相同的函数,但die不是throw,throw也不是die。以下语法没有遵循我试图遵循的OOP原则:
die new Exception($message);
throw new Exception($message);
无论逻辑上多么相似,为了抛出异常,我更喜欢以下语法:
die new Exception($message);
throw new Exception($message);
非常感谢stackoverflow社区 您可以将
throw
添加到UNIVERSAL
包中(这不是一个好的做法)
请注意,throw
忽略该消息,只显示类名
#!/usr/bin/perl
use warnings;
use strict;
{ package UNIVERSAL;
sub throw { die shift }
}
{ package MyClass;
sub new { bless {}, shift }
}
my $c = 'MyClass'->new;
$c->throw('Ouch!');
请参阅。像这样的范例如何,它可以同时解决您的两个问题
package Exception;
sub throw {
my $message = shift;
die Exception->new($message);
}
sub new {
# whatever
}
...
然后在任何软件包中,您都可以使用它:
package SomeClass;
sub do_something {
...
if ($error) {
Exception->throw($message);
}
}
非常有趣!我喜欢这个主意!它确实集中了它。我假设没有办法做到这一点,因为我偶然使用了语法“thrownewsomeobj()”?顺便说一句,我之前一直在寻找如何做到这一点。Perldocs有时有点模糊。另一个注释,我想我会在上面加上。我的意图是抛出对受祝福异常对象的引用。希望通过这样做,我可以在其中存储各种有用的信息,例如堆栈跟踪。再次感谢@史蒂夫:
die
可以抛出异常对象。我知道。但是,我不喜欢语法“die new Exception()”——如上所述。通常的方法是创建一个模块MyThrow
,该模块导出抛出
,并从其他模块/脚本中使用它。请不要编写新类名
。在Perl中,new
只是一个方法的名称,而不是一个关键字,它可能会混淆解释器。相反,请使用Exception->new($message)
。