2017-02-17 41 views
0

Я работаю над своим DAO и не могу понять, как лучше всего обрабатывать исключения. При использовании параметра .persist() есть три исключения, которые могут быть испущены: EntityExistsException/IllegalArgumentException/TransactionRequiredException.Обработка исключений JavaEE EntityManager

Мне просто интересно, что лучший способ поймать и выбросить исключение (я хочу обработать его на более высоком уровне).

Должен ли я поймать и бросить простое исключение, или более эффективно поймать вышеупомянутые исключения отдельно?

Первый метод, я просто поймать исключений и бросить его:

public void addAccount(final Account accountToAdd) throws AccountJpaException { 

    try { 
     em.persist(accountToAdd); 
    } catch (Exception e) { 
     throw new AccountJpaException(e); 
    } 

    } 
} 

Второй метод: я ловлю каждый из них по отдельности

public void addAccount(final Account accountToAdd) throws AccountJpaException, AccountExistsException { 

    try { 
     em.persist(accountToAdd); 
    } catch (EntityExistsException e) { 
     throw new AccountExistsException(e); 
    }catch(IllegalArgumentException e){ 
     throw new AccountJpaException(e); 
    }catch(TransactionRequiredException e){ 
     throw new AccountJpaException(e); 
    } 

    } 
} 

Спасибо за ваши советы!

+2

Вы не должны действительно ловить кого-либо из них. Особенно не 'IllegalArgumentException' или' TransactionRequiredException'. – Kayaman

+0

Почему? Необработанные исключения могут привести к некоторому беспорядку или я совершенно не прав в этом вопросе? – raik

+2

Потому что, как говорится в вашем вопросе, вы должны * обрабатывать их на более высоком уровне *. –

ответ

0

Большинство приложений N-уровня определяют границу транзакции в классе обслуживания. Было бы более уместно уловить эти типы исключений и исключить здесь конкретные исключения, а не подталкивать эту логическую обработку до DAO.

Рассмотрите на данный момент метод DAO, используемый двумя различными реализациями класса обслуживания. Понятно, что они затрагивают различные проблемы в вашей бизнес-области, и поэтому исключения, которые нужно бросить, должны быть более специфичными для домена.

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

Мое эмпирическое правило улавливает эти типы случаев на уровне службы/домена, распространяет оттуда специфические для домена исключения и обрабатывает эти исключения в контроллерах по мере необходимости, возможно, некоторым конкретным обработчиком ошибок, который отображает соответствующую веб-страницу просмотр на основе типов исключений и т. д.