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

C# 如果捕获到异常,如何使程序调用不同的方法,c#,exception,exception-handling,try-catch,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))

我有一个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.
        }
bool faultyYN=false;
foreach(XMLFiles中的字符串文件名)
{
使用(var reader=newstreamreader(文件名))
{
string shortFileName=Path.getfilenamwithoutextension(文件名);
xmlshedder.DataFile df=null;
尝试
{
var sw=新秒表();
sw.Start();
df=碎纸机.shreaddocument(XDocument.Load(reader,LoadOptions.SetLineInfo));
sw.Stop();
var运行时间=sw.ElapsedMilliseconds;
_InfoFormat(“在{1}毫秒内分解的文件”,短文件名,已过);
字符串outputFileName=Path.Combine(outputDirectory,shortFileName)+“.csv”;
sw.Reset();
sw.Start();
使用(var writer=new chunkedshreadedfilewriter(outputFileName))//完整文件路径
{
新数据文件CSVWriter().Write(df,
作者);
}
sw.Stop();
var elapsed2=sw.ElapsedMilliseconds;
_InfoFormat(“在{1}ms中写入的文件”,短文件名,elapsed2);
}
捕获(XMLE异常)
{
_log.Error(String.Format(“由于XML文档中的结构不正确,读取失败。文件名:。错误消息:{1}.”,shortFileName,e.Message),e);
faultyYN=true;
}
捕获(IOE异常)
{
_log.Error(String.Format(“由于IO异常,读取失败。文件名:。错误消息:{1}.”,shortFileName,e.Message),e);
}
if(bool faultyYN==true)
{
MoveFaultyXML(faultyXMLDirectory,shortFileName);
}
}
TidyUp(XMLFiles);//在进程完成后删除文件。
}
我曾尝试在捕获后将移动错误文件添加到错误目录,但文件仍被删除

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

我在网上读到,我不应该使用异常进行分支,但在这种情况下,我想不出其他解决方案。必须抛出异常才能知道文件有问题

如果有其他更好的方法来处理这个问题,或者如果这个方法有效,但我做错了,那么请帮助我,我会非常感激

谢谢,
Jetnor.

这是因为
TidyUp(XMLFiles)仍然会执行,您可以移动
TidyUp(XMLFiles)
在try块内调用,或者只在需要的catch块中调用它。

当XML不正确时,会抛出“xmleexception”,因此必须在该catch块内调用MoveFaultyXML

补充说明:

  • 不要将YN添加到布尔名称。使用类似于
    xmlisfault=true
    的方法。这使得代码更容易阅读,因为这样就有了条件语句,如

    if(xmlisfault){MoveFaultyXml();}

  • 即使是非程序员也能理解

  • 在这段代码中,您正在重新声明faultyYN变量,该变量应该给出一个错误

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

    在方法开头声明变量后,无需再次声明


  • 我想到的第一个解决办法是:

    移动
    MoveFaultyXML(faultyxml目录,短文件名)调用以在相应的catch块内执行此操作:

    catch (XmlException e)
    {
        //log
        MoveFaultyXML(faultyXMLDirectory, shortFileName); 
    }
    
    您不需要布尔值
    faultyYN

    现在,您可以创建一个表示XML文件的类(而不是在XMLFiles列表中只存储文件名):

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

    另一种解决方案是

    将foreach()替换为

    将包含XMLException的catch块更改为:

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

    这样,当您使用清理功能时,移动的任何文件都不再在要删除的列表中。

    此代码不可能编译,例如,您正在为布尔赋值null。您应该在设置faultyYN=true的位置调用MoveFaultyXML。按照其他人的建议删除该标志,并将调用移到catch内部。现在唯一的问题是从读卡器中释放文件,以便我可以将其移动到所需的目录。只需调用reader.Close()。谢谢Hakan。最后,一切都按预期进行了。:)这根本不起作用,在TidyUp中,他清楚地删除了所有XML文件,因此如果他在foreach循环中这样做,在第一次迭代后将不存在任何文件,因此他将尝试读取不存在的文件。嗨,Daniel。谢谢你的回复。因此,我删除了布尔检查,并将方法调用“MoveFaultyXml”移动到catch语句中。我现在遇到的问题是,文件被流读取器锁定,无法移动它。您能否建议在什么地方可以关闭Streamreader
    for(int i=XMLFiles.Count - 1; i >= 0; i--)
    {
        string filename = XMLFiles[i];
        //the rest of your code
    }
    
    catch (XmlException e)
    {
        //log
        MoveFaultyXML(faultyXMLDirectory, shortFileName); 
        XMLFiles.RemoveAt(i);
    }