2

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

这发生在 PAckage 类中。

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

为简单起见,我展示了传递给包的文件。

即`

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 块捕获

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

4

2 回答 2

2

在某些情况下,ProcessXml 无法做到其名称所暗示的那样;这些是错误情况。异常用于错误处理,尽管名称暗示。

关于异常的最大误解之一是它们是针对“异常情况”的。实际情况是它们用于传达错误条件。

Krzysztof Cwalina,框架设计指南:可重用 .NET 库的约定、惯用语和模式

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

阅读上述书籍中关于例外的章节,了解一些优秀的指导方针。

于 2011-12-19T01:21:09.120 回答
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;
 }
于 2011-12-24T04:06:50.360 回答