2012-04-15 48 views
1
的錯誤

我是第二年的IT學生。我們學習了3層編程,一個用於獲取數據,一個用於處理有請求的東西(所有方法都在這裏),另一個用於程序本身的工作。看到前兩個進入類而不是形式我不知道如何顯示錯誤。來自類

例如: 我們需要製作一個帶有webbrowser和其他一些東西的登錄系統。所以我在一個班級做登錄,但是如何檢查錯誤?我不認爲這是正常的,甚至可能做MessageBox.Show(錯誤);從一個類,我只能返回的東西,但我希望用戶名/編號返回,如果可能的話。

因此,總之,什麼是最好的/最可接受的方式來報告由數據造成的錯誤,所以從一個類?

回答

2

您的框架級別的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。它涵蓋了很多這種材料,是一個非常棒的閱讀。

+0

我們一點一滴地學習着東西,所以這還沒有被覆蓋。所以我不確定我是否應該閱讀它,這可能會讓我感到困惑,而不是幫助我。但我會看看。我有一個問題,公衆枚舉是做什麼的?從未見過它。 – Gideon 2012-04-15 16:01:20

+0

枚舉是一組不同的名稱,可以有一個基本類型爲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

1

你應該有一個類來驗證數據對象並返回錯誤信息。然後,您的前端代碼可以要求此類驗證數據並顯示返回的任何錯誤消息。

var username = GetUserName(); 
var password = GetPassword(); 
var validationResult = new Validator().ValidateLogin(username, password); 
if(validationResult.ErrorMessage != null) { 
    MessageBox.Show(validationResult.ErrorMessage); 
} else { 
    // Do what you would have done. 
} 

如果發生超出預期邏輯流程的錯誤,它們應該拋出異常。

+0

+1適當的方法 – ABH 2012-04-15 03:22:17

1

那麼你可以使用例外。您只需拋出異常,由調用者決定如何處理異常。

class Login 
{ 
    public Login() 
    { 

    } 

    public bool CheckLogin(string userName, string password) 
    { 
    // Do your validation here. 
    If every thing goes fine 
    return True. 
    else 
    throw Exception("custom message."); 
    } 

} 

class Input //class which takes input. 
{ 
    Login login = new Login(); 

    public void TakeInput(string username, string password) 
    { 
    try 
    { 
     login.CheckLogin(username, password); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.show(ex.message); 
    } 
    } 

} 
+0

這看起來gooooood!我可以很好地使用這個。 :)今晚我會試一試,會報告回來。 – Gideon 2012-04-15 16:01:55

+0

異常昂貴。您應該*不*在非特殊情況下使用它們。登錄失敗並不是一個特殊的情況。 – 2012-04-16 03:49:21