为应用程序设计错误消息传递系统的最具可扩展性/可扩展性的方法是什么?我将使用Perl。

时间:2016-03-01 02:23:12

标签: perl error-handling architecture

我只需要这种设计的通用架构。目前我正在考虑使用所有错误消息的哈希创建脚本。错误消息本身也是包含状态代码和应用程​​序中的错误消息的哈希。然后在应用程序的代码中发生错误的地方我只有die函数创建一个新错误并使用包含错误列表的脚本中的错误名称。我不知道这是否是设计这种系统的最佳或最有效的方法。我试图以这样的方式设计它,以便如果必须添加更多的错误。任何想法或指导都将非常感激。

2 个答案:

答案 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::ClassClass::Throwable的完全OO异常机制。它提供了一个简单的接口,允许程序员声明异常类。这些类可以抛出并捕获。如果为了调试目的而增加了默认的详细程度,则每个未捕获的异常都会打印完整的堆栈跟踪。

     

Exception::Base的功能:

     
      
  • 快速实现异常类

  •   
  • 完全OO没有闭包和源代码过滤

  •   
  • 不会混淆$SIG{__DIE__}$SIG{__WARN__}

  •   
  • 没有外部运行时模块依赖项,只需要核心Perl模块

  •   
  • 异常类的默认行为可以全局更改,也可以仅针对抛出的异常更改

  •   
  • 按类,消息或其他属性匹配异常

  •   
  • 与字符串,正则表达式或闭包函数匹配

  •   
  • 自动创建派生的异常类("在perlfunc界面中使用"

  •   
  • 容易消耗,请参阅Exception::System类,例如

  •   
  • 仅打印错误消息或转储完整堆栈跟踪

  •   
  • 可以传播(重新抛出)异常

  •   
  • 可以忽略堆栈跟踪输出的一些包

  •   
  • 对于不同的例外,某些默认值(即详细程度)可能不同

  •