已经掌握了在出现错误的情况下如何打破循环
本文关键字:情况下 何打破 循环 错误 掌握 | 更新日期: 2023-09-27 18:19:57
Q:
如果在事件中发现异常,我想中断循环。
代码:
XmlDocument x = new XmlDocument();
x.Load(targetFileName);
XmlReaderSettings settings = new XmlReaderSettings();
settings.CloseInput = true;
settings.ValidationEventHandler += Handler;
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(null,System.Web.HttpContext.Current.Server.MapPath("~/importSchema/IntialSchema.xsd"));
settings.ValidationFlags =
XmlSchemaValidationFlags.ReportValidationWarnings |
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ProcessInlineSchema |
XmlSchemaValidationFlags.ProcessSchemaLocation;
using (StreamReader str_reader = new StreamReader(targetFileName))
{
using (XmlReader validatingReader = XmlReader.Create(str_reader, settings))
{
while (validatingReader.Read())
{
//I wanna to break this loop if there is some caught error .
}
}
}
private static void Handler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning)
{
try
{
throw new Exception(
String.Format("Line: {0}, Position: {1} '"{2}'"",
e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message));
}
catch (Exception ee)
{
Common.ErrMappingForInformix.WriteLog(ee.Message);
ScheduleForm sf = new ScheduleForm();
sf.ShowStatus("Error,Invalid xml file", "error", "", 1);
}
}
}
#编辑1:
XmlDocument x = new XmlDocument();
x.Load(targetFileName);
XmlReaderSettings settings = new XmlReaderSettings();
settings.CloseInput = true;
settings.ValidationEventHandler += (senderValidation, ee) =>
{
if (ee.Severity == XmlSeverityType.Error || ee.Severity == XmlSeverityType.Warning)
{
try
{
this.validationFailed = true;
throw new Exception(
String.Format("Line: {0}, Position: {1} '"{2}'"",
ee.Exception.LineNumber, ee.Exception.LinePosition, ee.Exception.Message));
}
catch (Exception ex)
{
Common.ErrMappingForInformix.WriteLog(ex.Message);
this.ShowStatus("Error", "error", "", 1);
}
}
};
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add(null, System.Web.HttpContext.Current.Server.MapPath("~/importSchema/IntialSchema.xsd"));
settings.ValidationFlags =
XmlSchemaValidationFlags.ReportValidationWarnings |
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ProcessInlineSchema |
XmlSchemaValidationFlags.ProcessSchemaLocation;
using (StreamReader str_reader = new StreamReader(targetFileName))
{
using (XmlReader validatingReader = XmlReader.Create(str_reader, settings))
{
while (validatingReader.Read())
{
//Loop through the document
if (validationFailed)
{
break;
}
}
}
}
它中断了循环,但不执行事件处理程序。
您可以设置一个标志来指示Handler
方法中存在错误,然后检测该标志,如果已设置则使用break;
。
在这种情况下,验证处理程序最好使用内联匿名委托,这样就不需要向包含方法的类中添加新的成员变量。(如果类仅处理XML读取/验证,则添加成员变量也没那么糟糕)
编辑:匿名内联委托意味着您可以添加一个事件处理程序,基本上不必在单独的方法中。例如:
bool validationFailed = false; // outside of the handler
settings.ValidationEventHandler += (sender, e) =>
{
if (e.Severity == XmlS....
// set validationFailed = true; in here to signal failure
};
// then detect validationFailed being true to know if/when to break;
我只需在处理程序中抛出异常,并在捕获它时中断控制流。但是,也要避免抛出过于通用的异常类型:最好使用自定义异常:
class XmlValidationFailedException : Exception {
public XmlValidationFailedException(string message, Exception innerException) : base(message, innerException) {}
// as per Kieren's comment, make sure this exception type is defined according to best practices
}
private static void Handler(object sender, ValidationEventArgs e)
{
if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning)
{
string message = String.Format("Line: {0}, Position: {1} '"{2}'"",
e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message)
throw new XmlValidationFailedException(message);
}
然后你的循环可以变成这样:
try
{
while (validatingReader.Read())
{
// do logic
}
}
catch (XmlValidationException ex)
{
// handle the error (log, show, ...)
return;
}