Создание исключения в блоке перехвата с помощью спящего режима перед закрытием в конце

Итак, я хочу получить подтверждение по этому поводу. Я объясню в псевдокоде.

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 заявление, которое заботится об утилизации объекта для вас автоматически?

Другие вопросы по тегам