2013-05-21 58 views
2

我正在創建一個3層應用程序,並且遇到了處理錯誤處理的問題。我不知道我是否應該拋出異常或調用一種方法將問題傳達給其他層。錯誤處理:異常與錯誤方法

這是一個快速的例子,我有:
- 一個FileChooserFrame(表示層),允許用戶選擇列表中的文件。
- 一個DataHandler(應用層),用文件的路徑做一些事情,並做演示文稿&數據層之間的鏈接。
- a FileParser(數據層)解析文件並從中獲取數據。

現在讓我們說文件必須遵循一個特殊的結構,如果不是,我想顯示一個MessageBox。
我無法知道用戶在解析之前是否選擇了一個好文件。

我的問題是,當我看到文件沒有遵循結構時,我該怎麼辦?
我想到了兩件事:
1 - 停止當前操作並調用DataHandler(例如NotifyWrongFileErr())中的方法,該方法會要求框架顯示messageBox。
2 - 拋出一個自定義的異常,我會在FileChooserFrame中看到它會顯示彈出窗口。

這兩種情況都有其優點/缺點,所以我不能在它們之間做出選擇。什麼是最合適的做法?

PS:如果是n°2,我在哪裏編寫Exception類?在專門用於應用程序例外情況的文件中,還是在會拋出它的類旁邊?

+0

的樣子)的.aspx –

回答

4

那麼這是您的選擇,有例外的最佳做法是通常只在您沒有預料到的情況下拋出異常。由於您希望某人能夠選擇無效的文件名,因此調用該方法可能被認爲是「最佳做法」。但是,再次,沒有對錯,只要你滿意,就做你喜歡的事情。如果是我,我會爲這樣的事情創建一組Data Tier異常並拋出它們,這樣,如果我想用一些測試代碼(IoC)測試數據teir,我會看到異常。

1

如果它是「預期的」,該用戶可以有無效的輸入,並有標準的響應,在這種情況下,不需要例外。它是數據處理的一部分。只要確認在驗證失敗時執行所有必要的清理。

0

產生異常的從性能的角度來看的價格比要求幀顯示的MessageBox

1

什麼事件處理系統?

異常處理需要一個try/catch/throw結構,可以以昂貴的方式「冒泡」事件。但是,如果您從DataHandler中處理的FileParser(或Bubbled頂部到表示層)觸發事件,則可以將每個模塊與其他模塊分離。

一個小例子(假設的DataHandler層「知道」 FileParser層):

class FileParser 
{ 
public event EventHandler ParsingFailedEvent; 

public void ParseFile() 
{ 
// 1. Parse the file 
// 2. File structure isn't correct, raise event! 

      ParsingFailedEvent.Invoke(sender, e); 
} 

} 

class DataHandler 
{ 
private FileParser fp = new FileParser(); 
public DataHandler() 
{ 

      fp.ParsingFailedEvent+= new EventHandler(this.FileParsingHandler); 
} 

public void FileParsingHandler(object sender, EventArgs e) 
     { 
// do something, maybe display a MessageBox 
} 

} 

這說明你是多麼的不同,從活動的異常,主要是由於錯誤/故障相關的第一個條件。 另一方面,你有方法,但我認爲事件更靈活,因爲它們的代理系統或動態綁定功能。

在我看來,避免自定義異常的邏輯,沒有人知道當你在你的代碼中放置一個異常,並且沒有人知道它何時會在某些應用程序失敗時轉換。

看看到WPF的方式來處理和路由事件,它會在這裏http://msdn.microsoft.com/en-us/library/seyhszts(v=vs.110幫助您MSDN