Это всегда выгодно для 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;
Нет необходимости возвращать значение после выброса исключения. Если у вас есть эта ошибка, вы должны проверить пути, по которым ваш код может добраться, не вызывая исключения, например
if (something)
throw Exception;
else
return value;
Невозможность вернуть значение в ветви «else» элемента «if» приведет к ошибке компиляции, потому что исключение может или не может быть сгенерировано в зависимости от значения something
.
throw сам по себе завершает выполнение функции. Но если ваша функция возвращает значение, а исключение не выбрасывается, вам придется позаботиться о возврате значения. E.g.:
bool foo(bool _flag) throw(...)
{
if (_flag)
{
throw "foo is throwing an exception";
}
return true;
}
После 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 # - это ошибка компилятора, поэтому я не думаю, что хорошая идея - избавляться от предупреждения компилятора, но попытаться их решить.
С уважением ...
Ближайший эквивалент возможности "вернуть" значение, а также выбросить исключение - это когда функция записывает в указатель или ссылающийся объект перед выбросом исключения:
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;
}
}
}
Этот паттерн, однако, подвержен ошибкам и редко бывает полезен. Хорошо подумайте, прежде чем использовать его.