Является неправильным, должен иметь оператор возврата в блоке выгоды? Каковы альтернативы?
т.е.:
public bool SomeFunction()
{
try
{
//somecode
return true;
}
catch(Exception ex)
{
MessageBox.Show(ex.message);
return false;
}
}
Основная цель блока catch - предоставить место, где можно продолжить исключительную ситуацию, возникшую в блоке try. Итак, вы поймали исключение, обработали его ... и вернулись из метода. Если вызывающий метод не заботится об исключении, это абсолютно нормально.
Ничего страшного, только имейте в виду, что некоторый код может выполняться после инструкции возврата (возвращаемое значение будет обналичено).
try
{
return;
}
catch(Exception ex)
{
return;
}
finally
{
//some code
}
В этом нет ничего плохого, но если вы использовали ресурс, обычно для его закрытия используется блок finally, вместо того, чтобы вызывать метод close дважды. В этом случае вы можете использовать оператор return после блока finally.
Один из вариантов - сохранить возвращаемое значение во временной переменной:
public bool SomeFunction()
{
bool success = true;
try
{
//somecode
}
catch(Exception ex)
{
MessageBox.Show(ex.message);
success = false;
}
return success;
}
Но лично я нахожу способ, которым вы его написали (с одним универсальный оператор catch), чтобы он был более читабельным. С другой стороны, если вы ожидаете определенного исключения и у вас может быть несколько способов вернуть успех или нет ...
try
{
DoTheImportantThing();
DoTheOtherThingThatMightFailButWeDontCare();
}
catch (DontCareAboutItException ex)
{
log.Info(ex);
}
catch (Exception ex)
{
log.Error(ex);
return false;
}
return true;
Тогда, на мой взгляд, вам лучше продвигать операторы return как можно ближе к концу.
В качестве дополнительного примечания, в зависимости от приложения, подумайте о том, чтобы регистрировать перехваченные исключения, а не просто показывать их пользователю. Регистрируемые исключения намного надежнее, чем рассказы пользователя о том, что произошло.
Для меня имеет смысл функция, которая возвращает истину в случае успеха и ложь в случае неудачи. Надеюсь, в этом нет ничего плохого - я делаю это постоянно :)
Если в блоке try уже есть оператор возврата, я бы, вероятно, поместил другой оператор возврата в конец функции:
try
{
//somecode
return true;
}
catch(Exception ex)
{
MessageBox.Show(ex.message);
}
return false;
И это для того, чтобы избегайте многократных возвратов, если необходимо обработать несколько исключений.
public bool SomeFunction()
{
try
{
//somecode
return true;
}
catch(Exception ex)
{
MessageBox.Show(ex.message);
}
return false;
}
Лично я помещаю оператор return в конец метода, а не в блок catch. Но оба хороши. Все дело в удобочитаемости (субъективном) и рекомендациях в вашей организации.
Да, это совершенно нормально.
Не забывайте, что вы также можете использовать блок finally, который будет выполняться после return.
Вы можете нормально возвращаться из блока catch. Это обычно хороший функциональный код.