2013-04-08 75 views
6

如果面對一個邏輯錯誤錯誤,如(Expired user, invalid ID),那麼什麼是告訴從下面這個錯誤的父類的方法的最佳方式:從函數返回錯誤信息的最佳方法是什麼?

1-拋出定製例外,像下面這樣:

try 
{ 
//if (ID doesn't match) then 
Throw new CustomException(-1,"ID doesn't match"); 
} 
catch(CustomException ex) 
{ 
throw ex 
} 
catch(Exception ex) 
{ 
throw new CustomException(ex.ErrorCode,ex.message); 
} 

2 - 返回錯誤消息和代碼,如:

//if (ID doesn't match) then 
This.ErrorCode= -1; 
This.Message= "ID doesn't match"; 
+1

**嘗試**,** catch **和** throw **,第一個是最好的.. – NetStarter 2013-04-08 07:24:19

+1

請參閱[此問題](http://stackoverflow.com/questions/3926086/handling-已知的錯誤和錯誤的消息-IN-A-方法?RQ = 1)。 – 2013-04-08 07:24:38

+0

我現在可以爲什麼? – 2013-04-08 07:24:48

回答

2

更好的方法是拋出自定義異常。這就是爲什麼他們被介紹。如果您需要提供具體信息,如ErrorCode或其他內容,則可以輕鬆擴展基類Exception。主要理由是:

  • 您可以忽略從funcion返回無效的錯誤代碼,這可能導致你到你的系統狀態被破壞,而Exception的情況是你不能忽視。
  • 如果你的功能有用,那麼它應該返回一些你感興趣的數據而不是錯誤代碼,這會給你更堅實的設計。
1

在大多數情況下,您應該拋出異常。這是標準還是自定義異常取決於上下文,但與流程無關。

拋出異常強制任何實現相應地處理壞數據。如果您依賴實現來檢查屬性值是否正確處理,那麼意外,難以調試的異常遲早會遇到。

2

我想你應該使用異常,因爲它是確切的,它們是什麼。你可以在那裏放置相同的信息,就像在第二種情況下一樣。但是第一個和第二個之間的區別在於你給功能消費者一個可能被告知有問題的可能性,並且它以某種方式被處理。在第二種情況下,您只是說該功能起作用,但出錯了,並且用戶可能處理此信息

0

它完全取決於您的項目工作流程。如果它是一個意外的運行計時器錯誤,它抑制了你的程序,然後異常是一個不錯的選擇,但對於簡單的輸入檢查和可預期的產出,你應該使用枚舉

1

如果面對一個邏輯錯誤錯誤,例如(過期的用戶,無效的ID ),那麼什麼是告訴這個錯誤的父類的方法的最好辦法

  1. 既然你想要的父類的方法知道的錯誤,它的接縫,你是不知道,ID是啥User在您致電GetUser方法之前沒有過期。對?

  2. 如果您不確定傳遞給函數的參數是否有效,那麼使用異常是不合理的,您應該返回錯誤信息。

  3. 您可以返回錯誤信息更多功能方式類似於Scala,Go和Rust語言建議。

創建一個泛型類返回任何錯誤或值

public class Either(of ErrorType, ValueType) 
    public readonly Success as boolean 
    public readonly Error as ErrorType 
    public readonly Value as ValueType 

    public sub new(Error as ErrorType) 
     me.Success = False 
     me.Error = Error 
    end sub 

    public sub new(Value as ValueType) 
     me.Success = True 
     me.Value = Value 
    end sub 
end class 

創建錯誤的枚舉,你的函數可以有

public enum UserError 
    InvalidUserID 
    UserExpired 
end enum 

創建一個函數,用戶ID作爲參數並返回錯誤或用戶

function GetUser(ID as integer) as Either(of UserError, User) 

    if <business logic to find a user failed> then 
     return new Either(of UserError, User)(UserError.InvalidUserID) 
    end if 

    if <user expired> then 
     return new Either(of UserError, User)(UserError.UserExpired) 
    end if 

    return new Either(of UserError, User)(User) 
end function 

在了錯誤的調用者(父母)的方法檢查,並應用業務邏輯

dim UserID = 10 
dim UserResult = GetUser(10) 

if UserResult.Success then 
    rem apply business logic to UserResult.Value 
else 
    rem apply business logic to UserResult.Error 
end if 

注:如果您使用改寫例外,你會得到完全同樣的代碼量的代碼。

相關問題