2013-11-28 27 views
0

我有一個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. 
     } 

我試圖捕捉後加入移動錯誤文件錯誤的目錄,但文件仍不斷收到刪除。

所以基本上不工作,因爲我不知道我應該從哪裏調用它的方法是「MoveFaultyXML(faultyXMLDirectory,shortFileName)」。

我已閱讀,我不應該使用異常分支出來,但在這種情況下,我想不出一個替代的解決方案來淨。我必須拋出異常來知道文件有問題。

如果沒有處理這是更好的做法,或者如果這樣的作品的另一種方式,但我做錯了,請您幫助我,我真的很感激它。

謝謝, 捷特諾。

+3

這段代碼不可能編譯,例如你將一個null分配給一個bool。您應該在設置faultyYN = true的位置調用MoveFaultyXML。 –

+0

刪除了其他人建議的標誌,並將該呼叫轉移到catch內。現在唯一的問題是將文件從閱讀器中釋放出來,以便將其移動到所需的目錄。 – Jetnor

+0

只需調用reader.Close()。 –

回答

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; } 
} 

和刪除標誌設置爲「假」,如果你移動的文件。
在TidyUp中只刪除該標誌設置爲'true'的文件。

另一種解決辦法是

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

,當你得到這樣:

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

變化與XMLException到catch塊替換的foreach()到清除功能,任何被移動的文件都不再在列表中被刪除。

+0

嗨丹尼爾。感謝您的回覆。所以我刪除了布爾檢查,並且我在catch語句中移動了方法調用「MoveFaultyXml」。我現在遇到的問題是文件被流讀取器鎖定,無法移動。您可以請建議,一旦發現異常,關閉Streamreader的地方將成爲可以接受的地方。 – Jetnor

+0

現在都在工作。我必須對代碼進行的更改是在catch語句中移動「MoveFaultyXml」方法的位置,另一件事是在catch語句的方法調用之前關閉流讀取器,以確保發佈錯誤的文件。 – Jetnor

+0

我很高興你設法做到這一點:) –

-1

這是因爲TidyUp(XMLFiles);仍然會在您的異常被捕獲後執行,您可以將TidyUp(XMLFiles);移動到try塊內,或者只在需要的catch塊中調用它。

+0

這根本行不通,在TidyUp中他清楚地刪除了所有的XML文件,所以如果他在foreach循環中執行它,在第一次迭代之後將不存在任何文件,因此他將嘗試讀取那些不在那裏的文件。 –

1

當XML不正確時拋出`XmlException',所以它在這個catch塊中,你必須調用你的MoveFaultyXML。

其他注意事項:

  1. 不要添加YN布爾名。使用類似xmlIsFaulty = true的東西。這使得代碼更容易閱讀,因爲那時你必須條件語句像

    if(xmlIsFaulty){MoveFaultyXml();}

甚至非programmar可以理解。

  1. 在此代碼中,您將重新聲明應該給出錯誤的faultyYN變量。

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

    你聲明的方法開始的變量之後,你不需要再次聲明。

相關問題