编译器要求返回值 - 没有注意到被调用方法中的无条件异常

问题描述 投票:0回答:4

为什么c#编译器在以下场景中不够智能?

    void ThrowEx() {
        throw new Exception();
    }

    int Test() {
        ThrowEx();
    }

...Test()':并非所有代码路径都会返回值

编辑:在实践中,我想将异常抛出逻辑提取到一个单独的方法中,因为我厌倦了输入像

throw new FaultException<MyCustomFault>(new MyCustomFault(), "cannot validate the input");

这样的东西
c# exception
4个回答
3
投票

它不会在方法之间寻找;尤其重要的是,该方法可能位于不同的程序集中,并且可以在不重新构建的情况下进行更改,或者可以是虚拟的、外部的、抽象的或部分的 - 仅发现少数情况会令人困惑。

您可以让 ThrowEx 返回“int”,然后:

return ThrowEx();

这会让编译器高兴。或者使用泛型:

static T ThrowEx<T>() {...}
...
return ThrowEx<int>();

2
投票

ThrowEx() 无效。编译器知道这一点,并确定 Test() 方法没有返回值。该编译器旨在测试您成功的方法生成。将抛出的异常注入作为有效响应并不是编译器的合理期望。


1
投票

您希望编译器如何处理诸如

之类的情况
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(); 
}

0
投票

除此之外,调试器或探查器 API 可以允许跳过 ThrowEx 中的异常抛出,此时 Test 的行为将是未定义的。

© www.soinside.com 2019 - 2024. All rights reserved.