【问题标题】:Program Flow via Custom Exception通过自定义异常的程序流
【发布时间】:2012-01-23 06:30:42
【问题描述】:

我有一个解析 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 块捕获

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

【问题讨论】:

  • 标签多久是空的?
  • 它不应该是......仅在错误时

标签: c# design-patterns logging ooad


【解决方案1】:

ProcessXml 在某些情况下无法做到其名称所暗示的那样;这些是错误情况。异常是针对错误处理的,不管名字是什么意思。

关于异常的最大误解之一是它们是 对于“特殊情况”。现实是他们是为了 传达错误条件。

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

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

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

【讨论】:

  • 我认为有时“异常条件”与“错误”的语义被夸大了。我们这些使用术语“异常情况”的人通常只是警告不要对每个可以轻松快速地处理而不会引发异常的微小、常见错误事件使用异常。例如,提示用户而不是依靠异常来防止用户提供的输入导致被零除。
  • @AndrewBarber - 公平点。这也包括在书中。 :)
【解决方案2】:

您可以将错误与 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;
 }

【讨论】:

  • 另外,您已经在登录您的 FailPackage 方法,您只需添加其他日志记录并静默失败,绝不会抛出该异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2015-12-05
  • 1970-01-01
  • 2011-07-13
  • 2015-10-18
  • 2023-03-04
相关资源
最近更新 更多