2013-11-01 78 views
0

我正在尋找一些程序設計指導。類libarary的異常處理設計

我有一個類庫來處理數據庫中的數據。我有一個winforms應用程序,它是用戶輸入和管理數據的表示層。假設用戶輸入一些數據並嘗試保存。從Winforms應用程序我做這樣的事情:

MyTool theTool = new MyTool(); 
MyTool.FirstName = this.Textbox1.Text; 
MyTool.LastName = this.Textbox2.Text; 
//etc... 
int result = MyTool.SaveData(); //result is the ID of the inserted record. 

MyTool是我的類庫中的一種類型。在這種類型中,我會有:

public int SaveData() 
{ 
    if (IsReadyForInput()) 
    { 
    //..open a DB connection and save out the data 
    //..get the ID of the saved record 
    } 
    else 
    { 
     throw new ArgumentException("One or more arguments prevented saving the data"); 
    } 
    return theID 
} 

private bool IsReadyForInput() 
{ 
    if (this.FirstName.Length == 0) 
    { return false; } 
    if (this.LastName.Length == 0) 
    {return false;} 
    return true; 
} 

現在,我感興趣的是如何處理異常的最佳設計。例如,上述方法根本不具體,所以用戶不知道什麼是錯的。所以,我可以改寫這個做這樣的事情:

public void SaveData() 
{ 
    string errMess = IsReadyForInput(); 
    if (errMess.Length == 0) 
    { 
     //..open a DB connection and save out the data 
     //..get the ID of the saved record 
    } 
    else { 
     throw new ArgumentException(errMess); 
    } 
    return theID 
} 

private string IsReadyForInput() 
{ 
    if (this.FirstName.Length == 0) 
    { return "Specify a first name"; } 
    if (this.LastName.Length == 0) 
    {return "Specify a last name";} 
    return true; 
} 

然而,它只是似乎很優雅(或快速)方法不被比較字符串長度,找到錯誤消息。我曾試圖寫的東西,如:

public void SaveData() 
{ 
    ValidateInput(); 
    //..open a DB connection and save out the data 
    return theID 
} 

private void ValidateInput() 
{ 
    if (this.FirstName.Length == 0) 
    { throw new ArgumentException("Specify a first name"; } 
    if (this.LastName.Length == 0) 
    {throw new ArgumentException("Specify a first name"; } 
} 

的問題,這是異常實際上是由ValidateInput時拋出的前端調用「保存數據」,所以當異常到達頂部,對我來說,它會似乎不太清楚(尤其是如果在MyTool中有多種方法調用「ValidateInput()」)。

此外,我不確定在前端處理異常的最佳方法是因爲如果引發錯誤,ID永遠不會返回。

我想我只是尋找一些如何處理這種情況和一般驗證/錯誤處理的指導。謝謝你的幫助。

回答

1

我想知道的第一件事情是你是否需要拋出異常都當普通的控制流可能就足夠了:

if (IsReadyForInput()) 
{ 
    //..open a DB connection and save out the data 
    //..get the ID of the saved record 
} 
else 
{ 
    //..do whatever you need in case of invalid input 
} 

這個建議最明顯的問題是,我們是在一個方法某處您的類庫以及一些所需的效果(向用戶顯示警告等)發生在WinForms圖層中。然而,這表明了一個更好的解決方案;即,做在的WinForms代碼驗證:

if (IsReadyForInput()) 
{ 
    int result = theTool.SaveData(); 
    //...and whatever else should happen. 
} 
else 
{ 
    //..do whatever you need in case of invalid input 
} 

上述方法更簡單,讓你的程序的部分較少地依賴於對方(如MyTool並不需要關心用戶輸入的驗證)當比較時,例如拋出異常或使用特殊返回值來表示失敗。

0

看看FluentValidation(http://fluentvalidation.codeplex.com/)。我想這就是你要找的。

有了它,您可以定義您的驗證規則並調用其驗證方法。它將返回潛在驗證錯誤的完整列表,而不會導致代碼中出現異常。

+0

非常感謝,但我希望能得到一些關於最佳實踐的指導,以及其他人如何處理這個問題,所以我可以自己做。這似乎是一個非常常見的數據輸入結構... – rune711

+0

雖然流暢的驗證確實顯得很刺耳。 – rune711

+0

=)這是一個很好的框架,你會遇到的許多驗證框架/模式將非常相似。 – ohiodoug