为什么c#编译器在以下场景中不够智能?
void ThrowEx() {
throw new Exception();
}
int Test() {
ThrowEx();
}
...Test()':并非所有代码路径都会返回值
编辑:在实践中,我想将异常抛出逻辑提取到一个单独的方法中,因为我厌倦了输入像
throw new FaultException<MyCustomFault>(new MyCustomFault(), "cannot validate the input");
这样的东西
它不会在方法之间寻找;尤其重要的是,该方法可能位于不同的程序集中,并且可以在不重新构建的情况下进行更改,或者可以是虚拟的、外部的、抽象的或部分的 - 仅发现少数情况会令人困惑。
您可以让 ThrowEx 返回“int”,然后:
return ThrowEx();
这会让编译器高兴。或者使用泛型:
static T ThrowEx<T>() {...}
...
return ThrowEx<int>();
ThrowEx() 无效。编译器知道这一点,并确定 Test() 方法没有返回值。该编译器旨在测试您成功的方法生成。将抛出的异常注入作为有效响应并不是编译器的合理期望。
您希望编译器如何处理诸如
之类的情况void ThrowEx() {
decimal i = ... get 1 from app config;
decimal div = ... get 0 from app confid
decimal randomNumber = i / div;
do some other stuff....
}
int Test() {
ThrowEx();
}
除此之外,调试器或探查器 API 可以允许跳过 ThrowEx 中的异常抛出,此时 Test 的行为将是未定义的。