簡體   English   中英

可以/應該在c#switch語句中拋出異常嗎?

[英]Can/Should you throw exceptions in a c# switch statement?

我有一個返回int的插入查詢。 基於該int我可能希望拋出異常。 這是否適合在switch語句中執行?

 switch (result)
        {

            case D_USER_NOT_FOUND:
                throw new ClientException(string.Format("D User Name: {0} , was not found.", dTbx.Text));
            case C_USER_NOT_FOUND:
                throw new ClientException(string.Format("C User Name: {0} , was not found.", cTbx.Text));
            case D_USER_ALREADY_MAPPED:
                throw new ClientException(string.Format("D User Name: {0} , is already mapped.", dTbx.Text));
            case C_USER_ALREADY_MAPPED:
                throw new ClientException(string.Format("C User Name: {0} , is already mapped.", cTbx.Text));
            default:

                break;
        }

我通常會向交換機添加break語句,但它們不會被命中。 這是一個糟糕的設計嗎? 請與我分享任何意見/建議。

謝謝,〜在聖地亞哥

為什么不?

來自C#編程語言,第三版。 作者:Anders Hejlsberg等,第362頁:

switch部分的語句列表通常以breakgoto casegoto default語句結束,但允許呈現語句列表的端點不可達的任何構造。 [...]同樣, throwreturn語句總是將控制轉移到其他地方並且永遠不會到達其終點。 因此以下示例有效:

 switch(i) { case 0: while(true) F(); case 1: throw new ArgumentException(); case 2: return; } 

沒問題......為什么這會是糟糕的設計?

或者,由於異常類型在所有case都是相同的,因此您可以為錯誤消息構造查找表。 這樣可以節省一些代碼重復。 例如:

static private Dictionary<int, string> errorMessages;
static
{
    // create and fill the Dictionary
}

// meanwhile, elsewhere in the code...
if (result is not ok) {
    throw new ClientException(string.Format(errorMessages[result], cTbx.Text, dTbx.Text));
}

在消息本身中,您可以使用{0}{1}等選擇適當的參數。

我真的不同意你的變量命名約定;),但我不明白為什么你做的不合適。 這似乎是一種將錯誤從一種媒介轉換為另一種媒介的相當優雅的方式。

我假設你的“插入查詢”是某種形式的存儲過程。

如果可能的話,如果你把失敗的結果放在哪里,那么你可能會更好,否則你最終必須同時進行結果檢查和投擲。 但當然可能不可能。

此外,我將您的錯誤字符串變為帶有占位符的資源或常量,這樣如果您想更改措辭,則不必更改多個位置。

我覺得這沒關系。 看起來您正在使用switch語句將返回代碼映射到異常。 只要沒有太多的情況,這不是問題。

你采取的方法沒有錯。 Switch語句比if / then語句更容易閱讀(也可能更快)。 你可以做的另一件事是在a中加載可能的異常

Dictionary<Result_Type, Exception>

並從那里拉出例外。 如果你有很多switch語句,這將使代碼更緊湊(如果需要,你可以在運行時添加和刪除它們)。

在您的情況下,我沒有看到使用開關的任何問題。

應該更好地考慮例外本身是否合適。 通常,只有在出現超出預期行為范圍的情況時才應使用例外。 不應將異常用作程序流邏輯。 在你的情況下,你可能可以根據我看到的代碼使用它們。

也許我不同意這里的所有答案..

而不是必須切換代碼,我寧願將result傳遞給ClientException類並讓它決定它需要顯示什么字符串而不是在整個地方有一個丑陋的開關來創建各種消息

我的代碼看起來像:

throw new ClientException(result, cTbx.Text);

所以,即使你可以在switch...case拋出錯誤,你可以避免這一切都是我的看法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM