C# 在抛出异常的情况下,是否应该留下一个无法到达的中断?

C# 在抛出异常的情况下,是否应该留下一个无法到达的中断?,c#,exception,switch-statement,break,defensive-programming,C#,Exception,Switch Statement,Break,Defensive Programming,在一个只抛出异常的情况下,我留下无法访问的break语句是愚蠢的吗?我的防守部分希望在逻辑改变的情况下把它留在那里。我的另一部分不希望其他开发人员看到我代码上的编译器警告(“检测到无法访问的代码”) 怎么办 更新 我看到一些回复说,在以后删除抛出将导致编译器错误。但是,在抛出之后不间断地删除(或注释)抛出将堆叠案例,这可能是意外行为。我并不是说这是一个可能的场景,但是……那么,防御性编程是否只针对可能的场景 我的防守部分想把它留在那里,以防 逻辑变化 究竟什么样的逻辑会在这里发生变化?当抛出异常

在一个只抛出异常的情况下,我留下无法访问的break语句是愚蠢的吗?我的防守部分希望在逻辑改变的情况下把它留在那里。我的另一部分不希望其他开发人员看到我代码上的编译器警告(“检测到无法访问的代码”)

怎么办

更新

我看到一些回复说,在以后删除抛出将导致编译器错误。但是,在抛出之后不间断地删除(或注释)抛出将堆叠案例,这可能是意外行为。我并不是说这是一个可能的场景,但是……那么,防御性编程是否只针对可能的场景

我的防守部分想把它留在那里,以防 逻辑变化

究竟什么样的逻辑会在这里发生变化?当抛出异常时会发生什么,已经有了很好的文档记录。我认为你可以合理地确定,以后对C#的修订不会对“到目前为止编写的所有程序都不再工作”的规模造成破坏性的改变

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

我的防守部分希望在逻辑改变的情况下把它留在那里

好的,如果您删除
抛出
并忘记添加
中断
,编译器会让您知道

我看没有理由在那里休息。这是多余的,你只会触发一个警告,所以我会删除它。没有充分的理由把无用的代码乱放在逻辑上。

我会删除它


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

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

  • 你现在不需要它们
  • 看到大量警告总是让我感到紧张,因为在这种类型的警告发出的噪音中,您可能会丢失真正的警告(假设您关闭了“警告为错误”)

忽略某些编译器警告是在强化忽略任何编译器警告的不良行为。在我看来,这比将
break
语句留在中所获得的任何好处都要大


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

就我个人而言,我永远不会在生产代码中留下无法访问的代码。测试是可以的,但不要把它放在一边

你永远不会这么做,是吗

public void MyMethodThatThrows()
{
    throw new Exception();
    return;  // unneeded
}
那么为什么要保持
中断

我不会在
开关中“隐藏”它。我会尽快抛出
ArgumentExceptions
。这避免了副作用,也更加透明

有人可能会在使用
someInt
的某个点的开关前添加代码,尽管它是3

例如:

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

    switch (someInt)
    {
        // ...
    }
}

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

我的意思是在软件开发中有太多的陷阱——COM和互操作、安全性/权限和身份验证、证书。。。天哪,我不能告诉你我需要写多少代码来保护自己不被射中脚

只需删除此中断,因为它是多余的,对于知道“案例”应以
break
return
结尾的同事来说,这是令人困惑的,对于不知道这一点的同事来说,这应该是显而易见的。

指出:在每个case块之后都需要一个jump语句,例如break语句,包括最后一个case语句或默认语句


那么,“throw”不构成“jump语句”吗?我认为是的。因此,“break”不是必需的,而“unreachable”是不可到达的“问题消失了。”

break
不再需要了,我删除了它们,因为我在构建时将警告作为错误。有趣的问题-我的最初反应是包含break语句,但我认为这纯粹是习惯。pragma warning disable如果您觉得您的担心是有效的,但不想给其他人带来不便,但是过度防御会很快使你的代码基础变得混乱我想他的意思是如果异常被删除,但即使这样也不是问题,因为你必须有一个或另一个。也许我在那里使用了错误的术语,但不是,我的意思是如果C规范改变,只有变化无常的业务规则。你怎么会错过“真正的错误”要么你的代码无法编译,要么你已经决定警告不是“真正的错误”(即,你没有使用“将警告视为错误”标志进行构建)。如果你已经生成了150个以上的警告,这些警告都是噪声,并且你引入了一个生成有用警告的东西,这很容易错过。只要在没有休息的情况下移除投掷物,箱子就会堆积起来,这可能是非故意的行为。@TimLehner:没错,因为尸体是空的。也就是说。。。如果你让尸体空着,我想你这么做是有原因的。我希望你能信任你的同事,让他们知道开关工作的基本原理。难道我们不都希望有相同的东西吗,真的吗?:)@蒂姆莱纳:呵呵,是的,但老实说。。。错误会发生,这里没有防白痴的选项。如果你有一个开发人员经常犯愚蠢的错误。。。是时候找一个新员工了。@payo:谢谢你重申这一点。事实上,我们都错了。如果删除了异常,则什么也没有
public void SomeMethod(int someInt)
{
    if (someInt == 3)
        throw new ArgumentException("someInt must not be 3", "someInt");

    switch (someInt)
    {
        // ...
    }
}