Возврат после выдавания исключения

Это всегда выгодно для 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;
10
задан Kristian D'Amato 24 June 2010 в 16:27
поделиться

4 ответа

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

if (something)
    throw Exception;
else
    return value;

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

7
ответ дан 4 December 2019 в 02:25
поделиться

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

bool foo(bool _flag) throw(...)
{
    if (_flag)
    {
        throw "foo is throwing an exception";
    }
    return true;
}
2
ответ дан 4 December 2019 в 02:25
поделиться

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

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

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 # - это ошибка компилятора, поэтому я не думаю, что хорошая идея - избавляться от предупреждения компилятора, но попытаться их решить.

С уважением ...

-1
ответ дан 4 December 2019 в 02:25
поделиться

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

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
ответ дан 4 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: