2010-07-01 111 views
9

假設你有一個代表錯誤代碼的枚舉。將會有幾個代碼,每個代碼都有自己的基礎int值;但是,獲取默認值0的枚舉值看起來應該仔細考慮。C#:一個枚舉的默認值應該是None還是Unknown?

在錯誤代碼枚舉的情況下,我可以想到兩個特殊值:無(沒有錯誤的情況下)和未知(如果沒有現有的錯誤代碼是合適的,或者甚至當錯誤狀態不能被檢測到時)。

其中一個值看起來應該是0,其他的可能會得到其他的東西,如-1。將None值設置爲0還是將Unknown值設置爲0更合適?

public enum ErrorCode 
{ 
    None = -1, 
    Unknown = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

我的直覺告訴我,默認值應該是未知的,但我很好奇,如果任何人有不同的做法。

回答

4

絕對不是一個好的做法。但是,如果沒有其他辦法... ...那麼我會一般由第二個選項去:

public enum ErrorCode 
{ 
    Unknown = -1, 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
} 

0由公約「沒有錯誤」和-1順利進入細跟,有一些錯誤的認識(這可能是未知的)。

+2

感謝您回答基於約定的問題,而不會因爲它有多糟糕而分心。 – bwerks 2010-07-01 19:43:39

2

爲什麼在沒有錯誤時返回ErrorCode值?

沒有太多的意義。刪除這將解決您的問題。你可以只讓0是未知:

public enum ErrorCode 
{ 
    Unkown = 0, 
    InsufficientPermissions, 
    ConnectivityError 
} 

UPDATE

您的評論是有點嚇人。你永遠不應該有一個返回ErrorCode類型的方法。這是非常糟糕的做法。由於ErrorCodes只能在特殊情況下返回,所以拋出異常是個好主意。

如果需要,您可以在包含ErrorCode值的自定義異常中包含一個字段。

+0

如果你的函數簽名是'public ErrorCode DoFoo()',那麼當函數成功時你會返回什麼? – Karmastan 2010-07-01 18:01:12

+2

@Karmastan - 我永遠不會有一個方法返回一個ErrorCode。我會有一個自定義的異常被拋出幷包含ErrorCode。 – 2010-07-01 18:05:15

+2

當您知道在正常情況下操作可能失敗時,框架使用錯誤代碼。例如,Int32.TryParse返回一個值,而不是拋出異常。我也在驗證方法上使用錯誤代碼,我期待着一個問題。在這種情況下,出現錯誤並不是例外,這是預期的用途。 – 2010-07-01 18:26:33

15

由於您使用最佳做法標記問題:當您可以使用例外情況時,請勿使用錯誤代碼。

+0

與此問題有關的另一個帖子:[異常或錯誤代碼](http://stackoverflow.com/questions/253314/exceptions-or-error-codes) – Karmastan 2010-07-01 18:03:06

+4

您可以使用異常和錯誤代碼來消除歧義,並提供一個意思引用文檔中的特定錯誤。 – 2010-07-01 18:03:33

+3

錯誤不一定是特殊事件。錯誤代碼可能是Validate方法的返回值。 – 2010-07-01 18:23:04

6

在我看來,UnknownNoneErrorCode枚舉的上下文中表示相同的意思。我的推理是,如果我檢查的錯誤代碼比因爲我已經有一個錯誤。

我也認爲,錯誤代碼枚舉僅用於自定義異常或作爲現有異常類型的自定義數據,並且在兩種情況下都會有錯誤。

+0

可悲的是,這個電話不是由我決定的;但是,考慮到這些值將被保存到數據庫中,將「未知」作爲在數據庫中轉換爲空值的方法是有意義的。儘管如此,我認爲在這種情況下使用可爲空也是可行的。 – bwerks 2010-07-01 19:40:08

+0

爲什麼不打電話給你?如果您無法訪問捕獲異常並返回錯誤代碼的代碼(特別是未知錯誤),如何更改枚舉值?如果這是一個政治問題,請爲正義和真相的愛而存錢,請指出對這個和相關SO帖子的權力,以便他們可以看到大多數專業軟件開發人員強烈反對返回錯誤代碼! – apollodude217 2010-07-02 03:30:51

0

ErrorCodes bad。例外情況良好。但要回答問:

如果您的枚舉有一個「未知」值,它應該是默認值。

+0

首先,錯誤代碼通常與異常組合。其次,提供Validate方法是有禮貌的,以便用戶可以看到如果嘗試某些操作會發生什麼錯誤。記住,異常在CPU時間和代碼行中都很昂貴。 – 2010-07-01 18:28:16

+0

@Jonathan,我同意,除了驗證,你真的會稱之爲「ErrorCodes?」另外,通常,驗證發生在足夠高的級別上,您可以使用常量(或本地化字符串)來表示驗證錯誤。如果它足夠深入你的框架來需要一個代碼,那麼它真的*是一個特殊的條件。 – 2010-07-01 18:31:39

+0

我用來返回字符串,但這使搜索和過濾非常困難。所以現在我們除了字符串之外還有一個針對每種場景的錯誤代碼。這些也不是應用程序錯誤,這些是商業用戶需要研究和手動糾正的數據問題。 – 2010-07-01 18:43:24

3

首先,你不應該有一個無錯誤代碼。相反,稱它爲「成功」。

現在想想你將如何檢查錯誤代碼。大多數人想到是這樣的:

if (errorCode != Success) 

或他們所使用的速記

if (errorCode != 0) 

所以你有它。你的成功代碼是0,你沒有一個None代碼,而Unknown可以是你想要的任何東西。

0

同上所有的「我不會做它的迴應」,但如果你堅持,這是我的0.02美元。

ErrorCodes.None沒有意義,因爲沒有錯誤。 ErrorCodes.Unknown沒有幫助。嘗試返回null的錯誤代碼:

public ErrorCode? DoFoo() 

現在你可以檢查空

var error = DoFoo(); 
if (error != null) 
    // react 

仍然很糟糕,但至少它可以讓你返回錯誤代碼,如果沒有錯誤。

+0

我不同意這一點。首先,FxCop告訴我們,當「枚舉沒有明確設置」時,我們應該總是有一個「默認」值。因此,擁有「未知」或「無」是絕對合適的。 其次,使用可爲空的或?語法破壞了一個枚舉的主要觀點,強制消費者選擇一些東西! – 2010-07-01 19:42:30

4

我想我會不同意這一點。 「這是什麼功能的當前狀態

中的意義上使用時,這沒有什麼錯,錯誤代碼

爲了彌補一個例子:如果你有一個可選的網絡臨時文件夾,你想要訪問,並且想要顯示最近一次嘗試訪問它的結果時,可以將其保存在錯誤代碼中。也許在狀態欄上你想向用戶顯示當前狀態。

對我來說,我會使用None作爲默認值0。我認爲沒有理由讓Unknown變得消極。未知是完美的錯誤狀態。你可以把它放在列表的最後。在實踐中,我已經做了

public enum ErrorCode 
{ 
    None = 0, 
    InsufficientPermissions, 
    ConnectivityError, 
    ... 
    Unknown, 
} 

並回答你的問題,我說無必須是默認。沒有意思:沒有錯誤存在,你知道。未知對我意味着:存在一個很模糊的錯誤,你不能在你的代碼中解釋它。

0

我實際上不得不不同意任何說你應該只使用異常的人。在使用任何使用數據庫的應用程序時,您可能需要爲系統中的數據存儲狀態。無論它們是錯誤代碼還是某種狀態,它們都最好在數據庫中以整數表示。

使用和處理異常是一項非常重要的技能,應該使用,但我認爲將錯誤代碼與這些異常一起使用通常是一個好主意。它不需要太多的額外資源,並且適用於連接數據庫的應用程序。

我實際上會建議將「無」改爲「成功」,但建議您將「成功」值設爲1,並且從此處增加所有其他錯誤。其原因是因爲作爲大多數數據庫應用程序的標準,狀態列不可爲空,並且通常作爲整數進行跟蹤。如果您使用成功狀態0,這可能會導致問題,因爲默認情況下,如果用戶未明確插入其他內容,則不可空的整數列將設置爲0。這會導致錯誤的狀態/錯誤代碼,並在您的應用程序的將來出現問題。不僅如此,整數變量在C#中默認自動初始化爲0,導致它成爲自動成功,所以枚舉如果不設置初始值,那不是你想要的。

另外從編碼的角度來看,1也可以是真實的,因此它可以成功。有些情況下,情況可能並非如此。在基於Unix的系統中,返回0表示成功/沒有錯誤,而在其他語言如C++中,主函數的0返回值也是標準函數,也表示主函數成功執行。