2010-10-13 47 views
6

處理方法中發生的已知錯誤的一些好方法是什麼?處理方法中的已知錯誤和錯誤消息

讓我們用戶註冊方法,例如,當用戶註冊時,調用方法SignUp(User user)。有幾個已知的錯誤可能發生。

  • 電子郵件已經被註冊
  • 用戶名已經被註冊

你可以拋出特殊例外情況:

public void SignUp(User user) 
{ 
    // Email already exists 
    throw new EmailExistsException(); 
} 

現在具體的例外可能被捕獲。

這在我看來是不好的,因爲被用於流量控制的異常。

你可以返回一個布爾值,說明是否成功,並通過在如果出現錯誤,將被置的錯誤消息:

public bool SignUp(User user, out/ref string errorMessage) 
{ 
    // Email already exists 
    errorMessage = "Email already exists."; 
    return false; 
} 

我不喜歡這樣的幾個原因。

  • 值已被退回。如果該方法需要返回值,該怎麼辦?
  • 每次都必須傳遞錯誤消息。
  • 該方法的消費者應該是決定消息內容的人。

讓我們只說方法中的實際消息集是壞的。

您可以使用錯誤代碼:

public enum Errors 
{ 
    Successful = 0, 
    EmailExists, 
    UsernameExists, 
    Etc 
} 

public Errors SignUp(User user) 
{ 
    // Email already exists 
    return Errors.EmailExists; 
} 

// or 

public void SignUp(User user, out/ref Errors error) 
{ 
    // Email already exists 
    error = Errors.EmailExists; 
} 

這裏的最後一個是我最喜歡的,但我還是不喜歡它了一大堆。我不喜歡傳入錯誤代碼的想法。我不喜歡返回代碼的想法。

我喜歡使用自定義異常,因爲它似乎有點吸塵器的想法,但我不喜歡使用異常流量控制的思想。也許在這個例子的特定情況下,系統SHOULD中的電子郵件是個例外,並且沒關係。

有什麼其他人在這種情況下怎麼辦?

+0

可能重複http://stackoverflow.com/questions/409563/best-practices-for-exception-management- in-java-or-c) – 2010-10-13 17:18:14

回答

2

在這種情況下,我將創建一個特殊的屬性(名爲Reason)稱爲NewUserRegistrationException一個用戶自定義異常將包含失敗的原因。使用

你的榜樣,枚舉

​​

是非常可以理解的。

那麼,誰願意通過調用你的方法可以只.ToString()異常彈出的一般錯誤,或者註冊一個新用戶(在已閱讀文檔switchReason財產,並相應地做出反應(專注於電子郵件字段,帶紅色的密碼等)。

示例代碼:

public class NewUserRegistrationException : Exception 
{ 
    public RegistrationErrorType Reason { get; private set; } 
    public NewUserRegistrationException(RegistrationErrorType reason) 
     : base() 
    { 
     Reason = reason; 
    } 
    public NewUserRegistrationException(RegistrationErrorType reason, string message) 
     : base(message) 
    { 
     Reason = reason; //might as well create a custom message? 
    } 
    public NewUserRegistrationException(RegistrationErrorType reason, string message, Exception inner) 
     : base(message, inner) 
    { 
     Reason = reason; //might as well create a custom message? 
    } 
} 
的([在Java或C#爲異常管理的最佳做法]
+1

我不喜歡在流量控制中使用異常,但是如果它是一個錯誤,那麼這是一個錯誤。我想應該有辦法提前檢測。與File.Open一樣,您可以檢查文件是否先存在。 File.Open應該仍然可能會拋出一個FileNotFound異常或其他東西,如果它不存在。 – 2010-10-18 17:17:32

0

每當我開始思考這樣一個我做的第一件事是檢查是否已經有人想出了一個很好的解決一個共同的問題......所以,當爲「.NET驗證框架」很多執行谷歌搜索好的結果彈出...

最近我一直在使用TNValidate(http://tnvalidate.codeplex.com/

+0

我並沒有真正把它當作驗證。我想這個具體的例子,可以使用驗證。一般來說,我更多地談論一種方法。 – 2010-10-13 18:21:23

+0

我明白,但請檢查tnvalidate庫的Validator.cs和ValidatorResult.cs類,這與您可以使用的已知錯誤完全相同。我不認爲在這裏使用自定義異常是一個好的解決方案... – 2010-10-13 18:33:48

+0

所以,你認爲這個類應該有一個HasErrors方法/屬性可以檢查和某種屬性的錯誤列表嗎? – 2010-10-13 18:48:09