2010-06-24 2 views
9

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

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

Edit: (пример кода)

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

return 0; 
+2

Если последнее утверждение в вашей рутине является «броском», и вы все еще получаете предупреждение, возможно, вам следует опубликовать образец кода и сказать, какой компилятор вы используете. –

+0

То, что я имел в виду, было чем-то вроде того, что я добавил в вопрос ... Извините, я не добавил образец раньше. –

+0

Предупреждение о компиляторе не является проблемой с языком или стандартом, но с компилятором. Я предполагаю, что вы используете некоторую версию Visual C++ из формы сообщения об ошибке, но это может помочь узнать, какой из них. –

ответ

7

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

if (something) 
    throw Exception; 
else 
    return value; 

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

+3

MSVC предоставит C4715: не все пути управления возвращают значение для пути if в вашем коде, хотя этот путь не может возвратиться, поскольку он всегда выбрасывает. – Pait

2

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

bool foo(bool _flag) throw(...) 
{ 
    if (_flag) 
    { 
     throw "foo is throwing an exception"; 
    } 
    return true; 
} 
-1

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

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

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

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

+0

В C++ нет 'finally', и в вопросе не упоминается об исключении. И если компилятор генерирует предупреждение из-за отсутствия «возврата» после безусловного «броска», то предупреждение является фиктивным. –

+5

Очень плохой код для C++, у нас нет 'object',' null' или 'new' повсюду ... –

+0

Это на самом деле C#, но я думаю, что там есть даже небольшой уровень подобия ... – Padel

0

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

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; 
     } 
    } 
} 

Этот шаблон, однако, подвержен ошибкам и редко используется. Перед использованием тщательно подумайте.

Смежные вопросы