出现问题时如何引发异常?

时间:2014-10-23 18:45:33

标签: c# .net

我在我的应用程序中使用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);
}

3 个答案:

答案 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));