7

在无论如何都抛出异常的情况下留下无法访问的中断语句是我的愚蠢吗?如果逻辑发生变化,我的防御部分想把它留在那里。我的另一部分不希望其他开发人员在我的代码上看到编译器警告(“检测到无法访问的代码”)。

switch (someInt)
{
    case 1:
        // Do something
        break;
    case 2:
        // Do something else
        break;
    case 3:
        // Oh, we don't use threes here!
        throw new Exception("Business rules say don't use 3 anymore");
        break; // Unreachable...until the fickle business rules change...
    default:
        throw new Exception("Some default exception");
        break; // Unreachable...until...well, you get the idea.
}

该怎么办?

更新

我看到一些回复说在以后删除抛出会导致编译器错误。但是,简单地删除(或评论)抛出而不在它之后中断会堆叠案例,这可能是意想不到的行为。我并不是说这是一种可能的情况,但是……嗯,防御性编程是否只针对可能的情况?

4

9 回答 9

7

我会删除它们。几个原因:

  • 你暂时不需要它们
  • 看到很多警告总是让我感到紧张,因为您可能会在来自此类警告的噪音中丢失真正的警告(假设您已将警告作为错误关闭)。
于 2012-03-29T21:57:23.820 回答
7

我不会将其“隐藏”在switch. 我会ArgumentExceptions尽快扔掉。这避免了副作用并且也更加透明。

有人可能会在开关之前添加代码,someInt尽管它是 3。

例如:

public void SomeMethod(int someInt)
{
    if (someInt == 3)
        throw new ArgumentException("someInt must not be 3", "someInt");

    switch (someInt)
    {
        // ...
    }
}
于 2012-03-29T21:59:36.110 回答
2

通过忽略一些编译器警告,您正在强化忽略任何编译器警告的不良行为。在我看来,这比你留下break陈述所获得的任何好处都要大。

编辑:如果要删除语句,我删除了关于编译器强制您将break语句放回原处的原始观点throw。正如 payo 指出的那样,在某些情况下,编译器不会。它只会将案例与下面的案例结合起来。

于 2012-03-29T21:57:38.210 回答
2

就个人而言,我永远不会在生产代码中留下无法访问的代码。测试很好,但不要这样。

你永远不会这样做,对吗?

public void MyMethodThatThrows()
{
    throw new Exception();
    return;  // unneeded
}

那为什么要保留break

于 2012-03-29T21:58:21.750 回答
1

我会删除它。

它消除了警告,即使要更改逻辑并删除异常,您也会收到编译器错误,提示需要重新添加中断。

于 2012-03-29T21:57:18.737 回答
0

如果逻辑发生变化,我的防御部分想把它留在那里。

究竟什么逻辑在这里会发生变化?抛出异常时会发生什么记录得很好。而且我认为您可以合理地确定,以后对 C# 的修订不会对“迄今为止编写的所有程序都不再工作”造成重大变化。

即使没有编译器警告,冗余代码也不是一件好事,除非在日常维护期间通过防止错误代码可能会发挥作用,在这种情况下我们不能合理地说存在这种可能性。

于 2012-03-29T21:56:36.177 回答
0

如果逻辑发生变化,我的防御部分想把它留在那里。

好吧,如果您删除throw并忘记添加break编译器会通知您。

我认为没有理由休息。这是多余的,无论如何你都会触发警告,所以我会删除它。没有充分的理由留下无用的代码来混乱你的逻辑。

于 2012-03-29T21:57:02.527 回答
0

我希望我的项目资源如此酷且无故障,以至于我不得不考虑防御性编程的这种小案例:)

我的意思是在软件开发中存在太多的陷阱——COM 和互操作、安全/权限和身份验证、证书……天哪,我无法告诉你我必须编写多少代码来保护自己免受攻击射中脚。

只需删除此中断,因为它是多余的,对于那些知道“案例”应该以breakor结尾的人来说,这会让他们感到困惑,return并且对于不知道这一点的人来说应该是显而易见的。

于 2012-03-29T22:51:22.573 回答
0

MSDN C# Reference指出:“每个 case 块之后都需要一个跳转语句,例如 break,包括最后一个块,无论它是 case 语句还是默认语句。”

那么,“抛出”不构成“跳转语句”吗?我认为确实如此。因此,“中断”不是必需的,“无法访问”的问题就消失了。:)

于 2013-05-03T21:01:42.863 回答