Создание исключения в блоке перехвата с помощью спящего режима перед закрытием в конце
Итак, я хочу получить подтверждение по этому поводу. Я объясню в псевдокоде.
public void myFunc() throws Exception{
Session session = Hibernate.getSession();
try{
//do somthing
} catch(Exception ex){
throw ex;
} finally{
session.close();
}
}
Поэтому, если исключение выдается в блоке try, сессия никогда не будет закрыта. Ему придется ждать тайм-аута соединения, прежде чем он закроется, верно? Если да, то есть ли лучший способ ловить исключения в спящем режиме?
1 ответ
Код в 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
заявление, которое заботится об утилизации объекта для вас автоматически?