通过自定义异常的程序流程

时间:2011-12-19 00:39:14

标签: c# design-patterns logging ooad

我有一个解析XML文件的进程。

这是在PAckage类中发生的。

Package类有一个Delegate,它将对象设置为无效状态,并捕获有关发生Package Class的错误的详细信息

为简单起见,我正在将filitem传递给包..

即`

foreach( var package in Packages)
{
try
{

    package.ProcessXml(fileitem.nextfile);

}
catch (CustomeErrorException ex)
{
    Logger.LogError(ex)
}
}

在包内,我的验证看起来像这样

var Album = xml.Descendants()
    .Select(albumShards => new Album {
      Label = (string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault() == "" ?
FailPackage("Error on label Load",Componets.Package,SubComp.BuildAlbum ) :  (string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault()

在此验证中,我检查是否为标签返回“”...如果是,请使用错误信息调用Failpackage并创建异常

 protected override void FailPackage(string msg, LogItem logItem)
         {
             Valid = ProcessState.Bad;
             Logger.LogError(msg,logItem);
             throw CustomErrorException(msg, Logitem);

         }

通过包含try catch块

捕获

我担心的是我正在使用程序流程的异常...我应该如何处理这个问题,或者这是一个有效的模式。

2 个答案:

答案 0 :(得分:2)

在某些情况下,ProcessXml无法做出其名称所暗示的内容;这些是错误情况。除了名称所暗示的,例外是错误处理。

  

关于例外的最大误解之一就是它们   对于“特殊条件”。现实情况是,他们是为了   沟通错误条件。

Krzysztof Cwalina,Framework Design Guidelines:可重用.NET库的约定,惯用语和模式

换句话说,你是对的。 :)

阅读上述书中有关例外情况的章节,以获得一些出色的指导原则。

答案 1 :(得分:0)

您可以将错误与ProcessState一起放置:

foreach( var package in Packages)
{
    package.ProcessXml(fileitem.nextfile);
    if(!package.Valid)
        Logger.LogError(package.Error)
}



var albumShards = xml.Descendants().FirstOrDefault();
if((string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault() == "")
    return FailPackage("Error on label Load",Componets.Package,SubComp.BuildAlbum );

album = (string)albumShards.Descendants(TempAlbum.LabelLoc);


 protected override void FailPackage(string msg, LogItem logItem)
 {
     Valid = ProcessState.Bad;
     Logger.LogError(msg,logItem);
     Error = msg;
 }