2011-10-11 34 views
2

我目前正在設計一個處理不同類型文件的系統。我已經定義了以下接口可以處理錯誤的組件的異常或返回狀態

public interface IFileProcessor 
{ 
    bool ProcessFile(string fileContents) 
} 

目的是創建一些具體的實現來處理不同的文件類型。控制器類將負責:

  • 看一個文件夾中新添加的文件
  • 一個呼叫ProcessFile(讀取文件內容
  • 獲得這些IFileProcessor具體實現
  • 一個集合)傳遞文件內容
  • 如果某個組件無法處理該文件,則返回false,否則將處理該內容並返回true
  • 如果沒有IFileProcesso r實現可以將它由控制器移動到「未處理」文件夾的文件
  • 如果某個組件成功處理該文件,則該文件將被移動到「已處理」文件夾中
  • 如果某個組件拋出異常,移動到「失敗」文件夾

我創造IFileProcessor的實現將首先檢查它是否可以根據類型處理該文件(即csv),然後執行一些頂級驗證(即校驗文件頭)。如果這些檢查中的任何一個檢查失敗,將拋出控制器的異常,因爲整個文件被視爲無效。

但是,一旦頂級驗證成功,組件將處理文件中的每一行。從這一點開始,一條生產線可能無法處理(即驗證),並且其餘的過程繼續進行。

這是問題出在哪裏,我想知道是否最好記錄發生了驗證錯誤,然後在進程結束時拋出異常,或者更改ProcessFile()簽名以返回枚舉(一個已處理的,未處理的,已處理的錯誤)?

從我看過的文章看來,異常是狀態代碼的首選路線,但是在這種特殊的情況下,一個進程可以繼續下去,在最後使用一個人爲的異常來聲明進程沒有完成似乎是錯誤的100 %。

我會真正感興趣的人民對此的想法。

+0

不要過度設計這個。當文件出現問題時,你需要一個人來採取行動。沒有什麼有意義的事情可以做,它可以是好的或不可用的。只要確保這個人有一個清晰的診斷看看。 –

+0

嗨漢斯,在這種情況下的要求是,組件必須處理它的一切。文件中的每一行都會經過驗證過程,檢查該行中的引用是否爲我們的系統所知。如果已知該參考線,則處理線,否則將記錄驗證錯誤以供稍後進一步檢查。 – watsite

回答

2

一個建議:

而不是返回布爾或枚舉的,有它返回一個對象,呼叫者可以檢查。也許稱它爲FileProcessorResult。在對象中,您可以存儲各種信息,如整體成功或失敗,驗證狀態,處理狀態等。

在發生嚴重故障時,我會返回一個異常,以便調用者可以執行正確的操作。你可以派生一個異常類,以便try catch是乾淨的。

例子:

try 
{ 
    FileProcessorResult fpr = ProcessFile(Contents); 
    //Do something with fpr 

} 
catch (FileProcessorException fpe) 
{ 
    //Something unexpected occured during file processing, handle it 
} 

有可能是沒有絕對正確的答案,我可以給,所以請把這個作爲一個建議。

0

我不相信這是一個絕對的問題,因爲在我沒有看到一個明確的操作/做到這一點的答案...

我雖然同意你的看法,它似乎不可思議扔在函數結束時出現一個異常來表示部分處理,我也會用返回代碼並在函數完全失敗時拋出一個異常(即無法從文件讀取等)。

這樣做的一個好的原因是異常可能不會在調用函數中處理,並且如果文件被部分處理,您可能不希望執行停止,對嗎?

無論你選擇哪條路,你都需要徹底地記錄返回代碼/拋出的異常,其他人會爲此感謝你。