C # функция не может вернуться - предотвратить предупреждение компилятора - PullRequest
1 голос
/ 08 июня 2011

У меня есть функция, которая гарантированно никогда не вернется.Он регистрирует данные и выдает исключение.

public int f()
{
    ... do stuff ...
    if(condition)
        BadUserData.Throw(... parameters...);
    else
        return 0;
}

Я получаю сообщение об ошибке «не все пути кода возвращают значение. Конечно, это можно исправить с помощью фиктивного возврата после невозвратной функции, но мне интересноесли есть атрибут или что-то, что я могу применить к функции Throw, это означает, что он никогда не возвращается? Я посмотрел и не смог его найти.

Ответы [ 5 ]

11 голосов
/ 08 июня 2011

Нет, нет. На самом деле, чтобы получить наиболее подходящий стек вызовов, у меня было бы что-то более похожее на приведенное ниже, где метод создает исключение, но мы throw это локально:

if(condition)
    throw BadUserData.CreateSomeFormOfException(... parameters...);

, который решает обе проблемы за один раз.

Другой более ленивый подход:

if(condition) {
    // throws <===== comments are important here ;p
    BadUserData.Throw(... parameters...);
}
return 0;
6 голосов
/ 08 июня 2011

Ну вместо BadUserData.Throw на самом деле throw:

public int f()
{
    ... do stuff ...
    if(condition)
        throw new Exception("... parameters...");
    else
        return 0;
}

или пусть этот метод возвращает исключение, а затем:

throw BadUserData(... parameters...);

Кроме этого, нет, нетникаких атрибутов или чего-либо, что заставит ваш код компилироваться.

3 голосов
/ 08 июня 2011

Если работа метода состоит в том, чтобы регистрировать, а затем генерировать исключение, вы должны изменить сигнатуру метода на

public void f() 

вместо

public int f()

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

1 голос
/ 08 июня 2011

Верните исключение в BadUserData.Throw вместо его выброса и выполните:

public int f()
{
    ... do stuff ...
    if(condition)
        throw BadUserData.Throw(... parameters...);
    else
        return 0;
}
0 голосов
/ 08 июня 2011

Полагаю, у вас нет другого выбора, кроме добавления оператора возврата с фиктивным значением, например, return -1;.

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