我的问题是,希望简单。
在Perl中,如何创建一个可供所有对象访问的全局范围子例程?
sub throw
{
die(shift);
}
似乎在全局范围内工作,但之后无法访问包。我想避免在我的应用程序堆栈中的每个对象中做一些声明。
解决方案:如何创建像die这样的全局关键字的别名?
请注意:如果做这样的事情被认为是最佳做法,我真的不在乎。虽然它们在Perl中执行相同的功能,但是不会抛出die,并且throw不会死掉。以下语法不遵循我要遵循的OOP原则:
die new Exception($message);
但在逻辑上相似,为了抛出异常,我更喜欢以下语法:
throw new Exception($message);
非常感谢stackoverflow社区!
答案 0 :(得分:2)
您可以将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!');
请参阅Try::Tiny。
答案 1 :(得分:1)
这样的范例怎么样,可以同时解决你的问题?
package Exception;
sub throw {
my $message = shift;
die Exception->new($message);
}
sub new {
# whatever
}
...
然后在任何包装中你都可以使用它:
package SomeClass;
sub do_something {
...
if ($error) {
Exception->throw($message);
}
}