2011-12-19 22 views
2

我有一个解析XML文件的进程。通过自定义异常执行程序流程

这是发生在包类中。

打包类有一个代表该将对象设置为无效状态,并且捕获于错误的详细信息所发生的软件包类

为了简单起见,我表示被传递到包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块捕获

我的问题是我正在使用例外程序流...我应该怎么看待解决这个问题或者这是一个有效的模式。

+0

如何往往是标签是空的? – Amy 2011-12-19 01:08:44

+0

它不应该......只有在错误 – HoopSnake 2011-12-19 01:11:29

回答

2

ProcessXml在某些情况下未能做到名称含义;这些都是错误的情况。尽管名称暗示,但例外情况用于错误处理。

一个关于异常的最大的误解是,他们是 用于“特殊情况”。现实情况是,他们是 通信错误条件。

克齐斯茨托夫·克瓦林纳,Framework Design Guidelines:公约,成语和可重复使用.NET库

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

阅读上述书中有关例外的章节,以获得一些极好的指导。

+2

我认为有时“特殊条件”与“错误”的语义会显得有点过分。我们这些使用“特殊条件”一词的人通常只是谨慎对待每一个微小的常见错误发生都可以轻松快速地处理,而不会引发异常。例如,提示用户而不是依靠异常来防止用户提供的输入引起零除。 – 2011-12-19 01:26:16

+0

@AndrewBarber - 公平点。这本书也包含在内。 :) – TrueWill 2011-12-19 01:27:29

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; 
} 
+0

另外,您已经登录了FailPackage方法,您可以添加其他日志记录并默默失败,永远不会抛出该异常。 – ivowiblo 2011-12-24 04:07:34