Код в блоке Finally
всегда выполняется. Таким образом, сеанс будет закрыт, независимо от того, было ли выброшено исключение в блоке Catch
.Как предложил Кем в комментарии, вы должны попробовать пошагово пройти этот код в отладчике и посмотреть точное поведение для себя.
В качестве примечания, вы никогда не должны писать throw ex
, потому что этосбросит стек вызовов исходного исключения до точки, где выполняется этот оператор throw.В результате вы потеряете соответствующую информацию о том, где на самом деле произошло исключение.Вместо этого вы должны просто использовать throw
.В качестве альтернативы, вы можете создать новый класс исключений и установить для него InnerException
значение ex
, но это кажется пустой работой, если вам не нужно добавлять дополнительную информацию в трассировку стека.
Конечно,код, который вы показали выше, также поднимает больший вопрос о том, почему вы ловите исключение в первую очередь.Как только вы переписали его просто в throw
исключение в блоке Catch
, это то же самое, что вы не перехватили исключение в первую очередь.Вместо этого, почему бы просто не опустить блок Catch
в целом и довольствоваться только шаблоном Try-Finally
?
public void myFunc()
{
Session session = Hibernate.getSession();
try
{
//do something
}
finally
{
session.Close();
}
}
И затем, как только мы установим, что код можно изменить для реализации Try-Finally
Вместо этого мы можем пойти еще дальше.Почему бы просто не заменить весь шебанг на оператор using
, который позаботится об автоматической утилизации объекта?