Возвратитесь в try & catch или return in finally?
Является ли это одним из этих рисков? Это лучше? Или это одна из тех вещей, которые вы распечатываете и бросаете дротик, чтобы решить?
Я хочу сделать это сейчас, чтобы понять, как работает:
try {
stuff that changes something...
}
catch (System.Exception ex) {
something.worked = false;
something.err = ex.Message;
}
finally {
stuff.close();
return something;
}
Но я видел:
try {
stuff that changes something...
return something;
}
catch (System.Exception ex) {
something.worked = false;
something.err = ex.Message;
return something;
}
finally {
stuff.close();
}
Ответы
Ответ 1
Вы не можете return
от finally
. Вы получите ошибку компилятора:
Элемент управления не может покинуть тело предложения finally
Если целевой класс реализует IDisposable
, я бы сделал следующее:
using (stuff s = new stuff())
{
return stuff;
}
или
using (stuff s = new stuff())
{
try
{
// do stuff
return stuff;
}
catch (Exception ex)
{
// do logging or another stuff
return something;
}
}
вызовет Dispose()
для вас, если это потребуется/возможно.
Ответ 2
Лично я бы не стал использовать и
try {
stuff that changes something...
}
catch (System.Exception ex) {
something.worked = false;
something.err = ex.Message;
}
finally {
stuff.close();
}
return something;
Также в инструкции finally
убедитесь, что вам нужно закрыть/удалить объекты, поскольку они, возможно, никогда не были открыты/установлены, если они потерпели неудачу.
Также см. здесь Неужели плохая практика возвращается из блока finally catch try?
Ответ 3
Во втором подходе нет риска. Но он позволяет вам возвращать разные значения в случае исключений.