我正在尋找一些程序設計指導。類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永遠不會返回。
我想我只是尋找一些如何處理這種情況和一般驗證/錯誤處理的指導。謝謝你的幫助。
非常感謝,但我希望能得到一些關於最佳實踐的指導,以及其他人如何處理這個問題,所以我可以自己做。這似乎是一個非常常見的數據輸入結構... – rune711
雖然流暢的驗證確實顯得很刺耳。 – rune711
=)這是一個很好的框架,你會遇到的許多驗證框架/模式將非常相似。 – ohiodoug