我有一个解析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块
捕获我担心的是我正在使用程序流程的异常...我应该如何处理这个问题,或者这是一个有效的模式。
答案 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;
}