我有一个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。
答案 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。
附加说明:
不要将YN添加到布尔名称。使用类似xmlIsFaulty = true
的内容。这使代码更容易阅读,因为那时你有条件语句,如
if(xmlIsFaulty){MoveFaultyXml();}
即使是非程序员也能理解。
在此代码中,您将重新声明应该给出错误的faultyYN变量。
if(bool faultyYN == true) { MoveFaultyXML(faultyXMLDirectory,shortFileName); }
在方法开头声明变量后,您不需要再次声明它。
答案 2 :(得分:-1)
这是因为TidyUp(XMLFiles);
在捕获到异常后仍然执行,您可以将TidyUp(XMLFiles);
移动到try块中,或者只在需要的catch块中调用它。