可以/应该在c#switch语句中抛出异常吗?

时间:2010-04-22 18:13:45

标签: c# exception switch-statement throw

我有一个返回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语句但不会被命中。这是一个糟糕的设计吗?请与我分享任何意见/建议。

谢谢, 〜在圣地亚哥

8 个答案:

答案 0 :(得分:12)

为什么不呢?

来自 C#编程语言,第三版。作者:Anders Hejlsberg等,第362页:

  

switch部分的语句列表通常以breakgoto casegoto default语句结束,但允许任何呈现语句列表的结束点无法访问的构造。 [...]同样,throwreturn语句总是将控制转移到其他地方并且永远不会到达其终点。因此,以下示例有效:

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

答案 1 :(得分:4)

没问题......为什么这会是糟糕的设计?

或者,由于异常类型在所有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}等选择适当的参数。

答案 2 :(得分:3)

我真的不同意你的变量命名约定;),但我不明白为什么你做的不合适。这似乎是一种将错误从一种媒介转换为另一种媒体的相当优雅的方式。

我假设您的“插入查询”是某种形式的存储过程。

答案 3 :(得分:1)

如果可能的话,如果您在设置失败结果的地方投掷可能会更好,否则您最终必须同时执行结果检查和投掷。但当然可能不可能。

此外,我会将您的错误字符串变成带有占位符的资源或常量,这样如果您想更改措辞,就不必更改多个位置。

答案 4 :(得分:0)

我认为这没关系。看起来您正在使用switch语句将返回代码映射到异常。只要没有太多的情况,这不是问题。

答案 5 :(得分:0)

您正在采取的方法没有错。 Switch语句比if / then语句更容易阅读(也可能更快)。您可以做的另一件事是在

中加载可能的异常
Dictionary<Result_Type, Exception>

并从那里拉出异常。如果你有很多switch语句,这将使代码更紧凑(如果需要,你可以在运行时添加和删除它们。)

答案 6 :(得分:0)

我认为在你的情况下使用开关没有任何问题。

应该更加考虑例外本身是否合适。通常,只有在出现超出预期行为范围的情况时才应使用例外。不应将异常用作程序流逻辑。在你的情况下,你可能会根据我看到的代码使用它们。

答案 7 :(得分:0)

也许我不同意这里的所有答案..

我宁愿将result传递给ClientException类&amp;而不是必须切换代码。让它决定它需要显示什么字符串,而不是在整个地方有一个丑陋的开关来创建各种消息

我的代码如下:

throw new ClientException(result, cTbx.Text);

所以,即使你可以在switch...case中抛出错误,也可以避免这一切都是我的看法