像这个例子一样:
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
的值或者其他的东西?) 最佳答案
我知道我可以在最后一个语句中使用else来解决此问题,但我通常更喜欢明确表达。
您可以保持明确,而无需告诉编译器。由于唯一明确的理由是为了帮助人类读者,所以在实际的if
处添加注释会给您带来两全其美的好处:程序员会看到这种情况,而编译器不会因为不必要的throw
而烦扰您,或者return
s。
if ( home == away )
return MatchResult.Draw;
else if ( home > away )
return MatchResult.HomeWins;
else // if ( home < away )
return MatchResult.AwayWins;
在真正需要引发异常的情况下,因为某些分支不可能达到最佳操作,则使用断言:
if (!CheckNonNegative(arg)) {
throw new ArgumentException(nameof(arg));
}
...
if (arg == 0) {
... // Do something
} else {
Debug.Assert(arg > 0, "Method has checked arg to be non-negative");
... // Do something else
}
关于c# - 在理论上不可能到达分支时抛出什么异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45564653/