Возврат после исключения - PullRequest
10 голосов
/ 24 июня 2010

В любом случае выгодно ли return значение после throw исключения?Если нет, можно ли пропустить оператор return и можно ли как-то устранить ошибку компилятора C4715: not all control paths return a value?

Заранее спасибо.

Редактировать: (пример кода)

for (ushort i = 0; i < itsNumUnits; ++i)
    if (unitFormation[i] == unit)
    {
        return unitSetup[i];
    }
    else
        throw unit;

return 0;

Ответы [ 4 ]

7 голосов
/ 24 июня 2010

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

if (something)
    throw Exception;
else
    return value;

Если вы не вернете значение в ветке "else", если "if" приведет к ошибке компиляциипотому что исключение может или не может быть выброшено в зависимости от значения something.

2 голосов
/ 24 июня 2010

throw само по себе прекращает выполнение функции. Но если ваша функция возвращает значение, а исключение не выдается, вам придется позаботиться о возвращении значения. E.g.:

bool foo(bool _flag) throw(...)
{
    if (_flag)
    {
        throw "foo is throwing an exception";
    }
    return true;
}
0 голосов
/ 24 июня 2010

Ближайший эквивалент способности «возвращать» значение, а также генерировать исключение, - это когда функция записывает указатель или объект, на который ссылаются, перед выдачей исключения:

void my_func(int& ret)
{
    ret = 0;

    for (ushort i = 0; i < itsNumUnits; ++i) {
        if (unitFormation[i] == unit) {
            ret = unitSetup[i];
            return;
        }
        else {
            throw unit;
        }
    }
}

Однако этот шаблон подвержен ошибкам и редко полезен. Подумайте внимательно, прежде чем использовать его.

0 голосов
/ 24 июня 2010

После throw вы попадете в catch (код ниже throw не выполняется). Единственный блок, который выполняется, - это наконец.

Если вы хотите достичь чего-то похожего на то, что вы описали выше, выберите что-то вроде этого:

object returnVal = null; // the bad
try
{
    //some code here
    throw new Exception(); // something bad happened
    //some more code
    returnVal = new object(); // the good
}
catch(Exception ex)
{
    // log, try to recover etc.
    // maybe it`s a good idea not to throw it away if you can handle it here!
}
return returnVal; // either the good or the bad (never the ugly!)

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

Привет ...

...