我在我的应用程序中使用TRY-CATCH。尝试尝试读取XML文件。当然,如果它无法加载XML文件,它将引发异常。除此之外,我在try中有一个IF语句,用于查找XML文件中的特定节点;如果他们不存在,我需要它来解雇一个例外。这可能吗?
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(dialog.FileName);
if (xmlDoc.SelectSingleNode("event/text1") == null ||
xmlDoc.SelectSingleNode("event/text2") == null)
{
FIRE EXCEPTION
}
}
catch (Exception err)
{
MessageBox.Show("Invalid XML file selected:\n" + err.Message);
}
答案 0 :(得分:3)
你应该捕获一个较窄的异常,例如XmlException
,如果缺少一个节点则抛出另一个异常:
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(dialog.FileName);
if (xmlDoc.SelectSingleNode("event/text1") == null ||
xmlDoc.SelectSingleNode("event/text2") == null)
{
throw new InvalidXmlException("Missing event/text node");
}
}
catch (XmlException err)
{
MessageBox.Show("Invalid XML file selected:\n" + err.Message);
}
注意,这是假设您实际上抛出异常以便将其捕获到堆栈的更高位置。如果你没有其他任何关系,不要扔。
答案 1 :(得分:1)
为什么抛出异常只是为了抓住它,当你所做的只是显示一个Messagebox?只需显示消息框!
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(dialog.FileName);
if (xmlDoc.SelectSingleNode("event/text1") == null ||
xmlDoc.SelectSingleNode("event/text2") == null)
{
MessageBox.Show("Invalid XML file selected. No text1 or text node found");
}
}
catch (Exception err) // catch any other exception
{
MessageBox.Show("Exception occured:\n" + err.Message);
}
如果您确实重新抛出异常或进行其他一些常见活动(记录等),那么它可能有意义,但由于您没有对异常做任何事情,因此没有任何意义在这里养一个。
答案 2 :(得分:0)
不要抛出异常......在整个过程中进行健全性检查来处理错误情况。
实际例外情况应该是非预期情况。你知道这两种情况,为什么不适应它们呢?
我会重构代码以默认为错误,并且只在最后报告错误:
bool isXmlValid = false;
try
{
if (string.IsnNullOrEmpty(dialog.FileName) == false)
{
var xmlDoc = new XmlDocument();
xmlDoc.Load(dialog.FileName);
if (xmlDoc.SelectSingleNode("event/text1") != null &&
xmlDoc.SelectSingleNode("event/text2") != null)
{
// Process accordingly
isXmlValid = true;
}
}
}
catch (Exception ex)
{
Trace.WriteLine(ex.Message);
}
if (isXmlValid == false)
MessageBox.Show(
string.Format("Invalid XML file or Xml structure for file ({0})",
dialog.FileName));