当一个分支在理论上不可能达到时,抛出什么异常?

时间:2017-08-08 09:32:12

标签: c# exception compilation

就像这个例子一样:

public MatchResult GetResult(int home, int away)
{
    if ( home == away )
        return MatchResult.Draw;
    else if ( home > away )
        return MatchResult.HomeWins;
    else if ( home < away )
        return MatchResult.AwayWins;

    throw new Exception("Should be impossible");
}

我知道我可以使用else来解决最后一个问题,但我经常更喜欢明确。当然,出于示例目的,这是一种简化的情况。

接下来是:编译器抛出not all code paths return a value的原因,因为编译器的情况太复杂或者因为其他原因(比如理论上 )会改变值来自不同线程或其他东西的非托管代码中途的home?)

2 个答案:

答案 0 :(得分:3)

  

我知道我可以用最后一句话的其他方法解决这个问题,但我经常更喜欢明确。

您可以在不告诉编译器的情况下保持显式。由于明确的唯一理由是帮助人类读者,代替实际的if的评论为您提供了两全其美的优势:程序员看到了条件,而编译器并没有因为不必要的{{1 s或throw s。

return

在您真正需要抛出异常的情况下,因为某些分支无法达到最佳操作方法是使用断言:

if ( home == away )
    return MatchResult.Draw;
else if ( home > away )
    return MatchResult.HomeWins;
else // if ( home < away )
    return MatchResult.AwayWins;

答案 1 :(得分:0)

我认为(如果异常被抛出 - 我宁愿改变代码)这应该抛出NotSupportedException。通常,如果调用方法但是当时对象的当前状态不支持方法调用,则抛出此异常。

如果说逻辑定律已经破裂,你处于不支持的状态并且无法完成该方法,那只是一小段时间。