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

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

public void myFunc() throws Exception{
 Session session = Hibernate.getSession();
 try{
    //do somthing
 } catch(Exception ex){
  throw ex;
 } finally{
  session.close();
 }
}

Поэтому, если в блоке try выдается исключение, сессия никогда не будет закрыта.Ему придется ждать тайм-аута соединения, прежде чем он закроется, верно?Если да, то есть ли лучший способ ловить исключения в спящем режиме?

1 Ответ

2 голосов
/ 30 декабря 2010

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

...