您的框架級別的API(例如您的圖層)應該爲實際錯誤使用異常,並返回值以報告非嚴重錯誤。
public class Login
{
public bool AccountExists(string name) {
bool exists;
// do checking
return exists;
}
public LoginResult Login(string name, string password) {
// Try login
// If successful
return LoginResult.Success;
// What if the user does not exist?
return LoginResult.AccountNotFound;
// What about an error?
return LoginResult.Error;
}
}
public enum LoginResult
{
None,
AccountNotFound,
Error,
Success
}
在上面的示例中,您可以通過返回值報告操作的狀態。對於LoginResult,這甚至可以是一個包含更多關於結果信息的值類型(結構體)(例如,一個字符串消息或其他東西)。由於這些類型的非關鍵操作,這裏沒有必要例外。例外是昂貴的,並不總是需要報告錯誤。
現在我們來談談一種不同類型的錯誤。邏輯開發人員錯誤。這些應該通過拋出異常來處理。以這個例子(假設我們有一些類型爲Account的角色屬性)。
public class Foo
{
public bool IsAdmin(Account account) {
if (account == null) {
throw new System.ArgumentNullException("You cannot pass a null account!");
}
return account.Role == "Admin";
}
}
作爲開發者,我們知道該帳戶不應該爲空,因此我們應該檢查它並拋出異常(如果是)。如果這個異常被拋出,它在調用代碼中的一個錯誤,應該被修復而不是傳入一個空值。
既然我已經給出了兩個粗略的場景,那麼這對你的問題又是如何的呢?這些是API的。無論您的UI層是什麼,無論是WinForm,WPF Window,WebForm還是其他一些UI,用戶界面都只需使用該API。 API負責報告UI可用的信息,UI負責以任何最適合該UI的方式顯示信息。
框架API層不應該負責使用UI向用戶報告錯誤。他們只應負責向可以採取結果的開發人員報告錯誤,並以某種方式將其連接到UI層。例如,您絕不會顯示消息框或從框架API寫入控制檯。你會返回一些UI可以用來顯示自己的消息的結果。
我強烈建議您閱讀Framework Design Guidelines。它涵蓋了很多這種材料,是一個非常棒的閱讀。
我們一點一滴地學習着東西,所以這還沒有被覆蓋。所以我不確定我是否應該閱讀它,這可能會讓我感到困惑,而不是幫助我。但我會看看。我有一個問題,公衆枚舉是做什麼的?從未見過它。 – Gideon 2012-04-15 16:01:20
枚舉是一組不同的名稱,可以有一個基本類型爲sbyte,byte,short,ushort,int,uint,long或ulong。您可以使用枚舉來表示一組值(例如一週中的幾天)。您也可以使用枚舉來表示標誌。看到這篇文章。 http://msdn.microsoft.com/en-us/library/sbbt4032(v=vs.80).aspx – 2012-04-15 18:25:51