我有一个模块,它为它所属的包定义异常。异常是用 声明的Exception::Class::Nested
。
出于讨论的目的,假设该模块名为Foo::Bar::Exception
,并且它定义的所有异常都是该模块的第一级子类(例如,Foo::Bar::Exception:DoNotDoThat
)。我关心的所有异常都在这个模块文件中定义;我对任何其他模块对我所做的任何额外的子类化都不感兴趣。
对于我的import
方法,我想构建一个所有正在定义的异常的列表,并且我想通过以某种方式遍历符号表来做到这一点,而不是保持一个可能与定义不同步并且具有需要人工维护。
那么,如何Foo::Bar::Exception->import
遍历Foo::Bar::Exception
的符号表,找到模块中已经声明的所有异常(一级子类)呢?这只是我感兴趣的活动加载符号表;没有文件系统搜索等。
谢谢!
[附录]
由于我所有的异常子类名称都以Exception
or结尾Error
,这看起来越来越接近我想要的:
my %symtable = eval("'%' . __PACKAGE__ . '::'");
my @shortnames = grep(m!(?:Error|Exception)::$!, keys(%symtable));
@shortnames = ( map { $_ =~ s/::$//; $_; } @shortnames );
my @longnames = ( map { __PACKAGE__ . '::' . $_ } @shortnames );
一些括号是不必要的,但我添加它是为了清楚地了解数组上下文。