我只需要这种设计的通用架构。目前我正在考虑使用所有错误消息的哈希创建脚本。错误消息本身也是包含状态代码和应用程序中的错误消息的哈希。然后在应用程序的代码中发生错误的地方我只有die函数创建一个新错误并使用包含错误列表的脚本中的错误名称。我不知道这是否是设计这种系统的最佳或最有效的方法。我试图以这样的方式设计它,以便如果必须添加更多的错误。任何想法或指导都将非常感激。
答案 0 :(得分:1)
当你说;
错误消息本身也是包含状态代码和应用程序中的错误消息的哈希。然后在应用程序的代码中发生错误的地方我只有die函数创建一个新错误并使用包含错误列表的脚本中的错误名称。
...或多或少,你正在描述异常对象。这个简单的异常类(taken from here)
package Exception;
sub new
{
my $class = shift;
bless { msg=>"@_" }, $class;
}
sub what
{
my ($self) = @_;
return sprintf "Exception: %s\n", $self->{msg};
}
为它的大小做了很多,并且像这样使用;
sub try(&) { eval {$_[0]->()} }
sub throw($) { die $_[0] }
sub catch(&) { $_[0]->($@) if $@ }
# The main program
try {
throw Exception->new("A real exception");
};
catch {
print $@->what;
};
此对象只有一个属性 msg (称为 - >什么),但您显然可以拥有错误代码,应用,应用阶段等属性上。请注意&throw
是围绕 die 的小包装器,并且异常对象是在需要的位置创建的 - 就像您的语句" ...其中发生错误在应用程序的代码中,我只有die函数,它会产生一个新的错误..."
您的"脚本带有所有错误消息的散列" 然后成为您的应用程序专用于异常对象的(子)模块
1)预先创建它们并通过一些错误代码对它们进行索引;或
2)(更好)创建一个通用的小层次结构 越来越具体的异常类,您可以在检测到错误时同样创建动态异常对象(与上面的内容非常相似)
最后,根据您的具体情况,您可能希望使用cpan的预先制作的,完整的铃声和口哨解决方案。我自己没有使用它,但Exception::System看起来很不错。
答案 1 :(得分:0)
Exception::Base非常好。
此类实现类似于
Exception::Class
或Class::Throwable
的完全OO异常机制。它提供了一个简单的接口,允许程序员声明异常类。这些类可以抛出并捕获。如果为了调试目的而增加了默认的详细程度,则每个未捕获的异常都会打印完整的堆栈跟踪。
Exception::Base
的功能:
快速实现异常类
完全OO没有闭包和源代码过滤
不会混淆
$SIG{__DIE__}
和$SIG{__WARN__}
没有外部运行时模块依赖项,只需要核心Perl模块
异常类的默认行为可以全局更改,也可以仅针对抛出的异常更改
按类,消息或其他属性匹配异常
与字符串,正则表达式或闭包函数匹配
自动创建派生的异常类("在perlfunc界面中使用"
容易消耗,请参阅
Exception::System
类,例如仅打印错误消息或转储完整堆栈跟踪
可以传播(重新抛出)异常
可以忽略堆栈跟踪输出的一些包
对于不同的例外,某些默认值(即详细程度)可能不同