如果异常被捕获,如何使程序调用不同的方法

时间:2013-11-28 11:43:04

标签: c# exception exception-handling try-catch

我有一个try catch语句,它处理读取xml文件列表并将它们输出到csv文件。

现在我希望能够将错误的xml文件移到健康文件的不同文件夹中,但我不知道该怎么做。

到目前为止我所得到的内容如下:

 bool faultyYN = false;
            foreach (string filename in XMLFiles)
            {
                using (var reader = new StreamReader(filename))
                {
                    string shortFileName = Path.GetFileNameWithoutExtension(filename);
                    XMLShredder.DataFile df = null;

                    try
                    {
                        var sw = new Stopwatch();
                        sw.Start();
                        df = Shredder.ShredDocument(XDocument.Load(reader, LoadOptions.SetLineInfo));
                        sw.Stop();
                        var elapsed = sw.ElapsedMilliseconds;
                        _log.InfoFormat(" Shredded file <{0}> in {1}ms", shortFileName, elapsed);
                        string outputFileName = Path.Combine(outputDirectory, shortFileName) + ".csv";

                        sw.Reset();
                        sw.Start();

                        using (var writer = new ChunkedShreddedFileWriter(outputFileName))//full file path
                        {
                            new DataFileCsvWriter().Write(df,
                                                          writer);
                        }
                        sw.Stop();
                        var elapsed2 = sw.ElapsedMilliseconds;
                        _log.InfoFormat(" Wrote file <{0}> in {1}ms", shortFileName, elapsed2);
                    }
                    catch (XmlException e)
                    {
                        _log.Error(String.Format("Reading failed due to incorrect structure in XML Document. File Name : <{0}>. Error Message : {1}.", shortFileName, e.Message), e);
                        faultyYN = true;

                    }
                    catch (IOException e)
                    {
                        _log.Error(String.Format("Reading failed due to IO Exception. File Name : <{0}>. Error Message : {1}.", shortFileName, e.Message), e);
                    }
                if(bool faultyYN == true)
                {
                      MoveFaultyXML(faultyXMLDirectory, shortFileName);

                }

            }
            TidyUp(XMLFiles);//deletes the files after the process has finished.
        }

我已经尝试在catch之后添加Move故障文件到故障目录,但文件仍然被删除。

所以基本上这个方法不起作用,因为我不知道应该从哪里调用它是“MoveFaultyXML(faultyXMLDirectory,shortFileName)”。

我在网上看到我不应该使用例外来分支,但在这种情况下,我想不出另一种解决方案。必须抛出异常才能让我知道文件有问题。

如果有另一种处理方法,这是更好的做法,或者如果这种方式有效但我做错了那么请帮助我,我真的很感激。

谢谢, Jetnor。

3 个答案:

答案 0 :(得分:2)

我想到的第一个解决方案是

移动MoveFaultyXML(faultyXMLDirectory, shortFileName);调用以在相应的catch块中执行此操作:

catch (XmlException e)
{
    //log
    MoveFaultyXML(faultyXMLDirectory, shortFileName); 
}

您不需要布尔值faultyYN 现在,您可以创建一个表示XML文件的类(而不是仅在XMLFiles列表中存储文件名):

public class XMLFile
{
    public string FileName { get; set; }
    public bool Delete { get; set; }
}

如果移动文件,请将Delete标记设置为“false” 在TidyUp中,仅删除此标志设置为“true”的文件。

另一种解决方案是

替换foreach()
for(int i=XMLFiles.Count - 1; i >= 0; i--)
{
    string filename = XMLFiles[i];
    //the rest of your code
}

使用XMLException将catch块更改为:

catch (XmlException e)
{
    //log
    MoveFaultyXML(faultyXMLDirectory, shortFileName); 
    XMLFiles.RemoveAt(i);
}

这样,当你进入CleanUp功能时,所有被移动的文件都不再被删除。

答案 1 :(得分:1)

`XmlException&#39;当XML不正确时抛出,因此它必须在此catch块中调用MoveFaultyXML。

附加说明:

  1. 不要将YN添加到布尔名称。使用类似xmlIsFaulty = true的内容。这使代码更容易阅读,因为那时你有条件语句,如

    if(xmlIsFaulty){MoveFaultyXml();}

  2. 即使是非程序员也能理解。

    1. 在此代码中,您将重新声明应该给出错误的faultyYN变量。

      if(bool faultyYN == true) {     MoveFaultyXML(faultyXMLDirectory,shortFileName); }

      在方法开头声明变量后,您不需要再次声明它。

答案 2 :(得分:-1)

这是因为TidyUp(XMLFiles);在捕获到异常后仍然执行,您可以将TidyUp(XMLFiles);移动到try块中,或者只在需要的catch块中调用它。