2017-02-17 60 views
0

我正在处理我的DAO,无法弄清楚处理异常的最佳方法。使用.persist()时,可以发出3个异常: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中抛出一些超级通用异常,以仅捕获这些异常并在服务级别重新抛出更细粒度的异常,这是过度的。

我的经验法则是在服务/域级别捕获这些类型的案例,从那里传播特定于域的异常,并根据需要在控制器中处理这些异常,可能是通过某些显示相应网页的特定错误处理程序基于异常类型的视图等。