Компилятор, запрашивающий возвращаемое значение - не замечая безусловного исключения в вызываемом методе - PullRequest
1 голос
/ 01 декабря 2010

Почему компилятор c # недостаточно умен в следующем сценарии?

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

    int Test() {
        ThrowEx();
    }

... Test () ': не все пути кода возвращают значение

Редактировать: на практике я хочу выделить логику исключения в отдельный метод, потому что я устал набирать такие вещи, как throw new FaultException<MyCustomFault>(new MyCustomFault(), "cannot validate the input");

Ответы [ 4 ]

3 голосов
/ 01 декабря 2010

Это не выглядит между методами;не в последнюю очередь, метод может быть в другой сборке и может изменяться без перестроений, или может быть виртуальным, внешним, абстрактным или частичным - было бы сложно определить только небольшое количество случаев.

Вы могли бы иметьThrowEx возвращает «int», а затем:

return ThrowEx();

, что сделает компилятор счастливым.Или используйте дженерики:

static T ThrowEx<T>() {...}
...
return ThrowEx<int>();
2 голосов
/ 01 декабря 2010

ThrowEx () является недействительным.Компилятор знает это и определяет, что для метода Test () нет возвращаемого значения.Компилятор предназначен для проверки вашего успешного метода производства.Внедрение брошенного исключения в качестве правильного ответа не является разумным ожиданием компилятора.

1 голос
/ 01 декабря 2010

И как вы хотите, чтобы компилятор обрабатывал такие случаи, как

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 голосов
/ 01 декабря 2010

Помимо прочего, API-интерфейс отладчика или профилировщика может позволить пропускать исключение в ThrowEx, и в этом случае поведение Test будет неопределенным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...