2017-06-22 49 views
2

我正在捕获DAO类中的泛型异常并将其包装为DaoException。这样做的主要原因是,EBean在保存失败的情况下抛出不同的运行时异常,我不想将它们传播到上层。上层应该只知道保存是否成功。在DAO层捕获泛型异常是一种不好的做法吗?

以下是代码片段。

public void save(Object object) throws DaoException { 
     try { 
      Ebean.save(object); 
     } catch (Exception e) { 
      throw new DaoException("Error saving record", e); 
     } 
    } 

这违背了一般的概念,即泛型异常不应该被捕获。

但是,在这种情况下这是可以接受的,或者仍然是一个不好的做法?

还有几件事要添加到我的问题。 我确切的要求是

  1. 有设置,我需要在交易与坚持独立的对象。 (需要这样做的交易,以避免在同一时间其他情况下进行更改到同一对象)

  2. 如果一个对象未​​能persits由于一些错误,还是其他物体需要坚持。 (Cz他们是独立的)

我在做的服务层是循环的对象集。如果我从一个对象中收到一个DaoException,我将它添加到错误响应中并继续循环。但它不应该打破交易。 有没有更好的方法来满足这个要求?

+0

为什么save函数会抛出不同的类型? –

+0

可能重复的https://stackoverflow.com/questions/21938/is-it-really-that-bad-to-catch-a-general-exception?rq=1 – scottb

回答

1

在异常处理中,遵循的拇指规则是:早期捕获,稍后处理。

在Dao层,如果你想在发生任何特定类型的Excepion时采取任何行动,那么你必须捕获特定的异常而不是泛型的Exception类。

E.g:当使用弹簧JDBC,我们可以捕获各种各样类型的exceptions ,并相应地,我们可以采取的动作,例如执行数据库操作的重试或等待一段时间才能获得的任何锁。然而,如果你在异常情况下不需要在Dao层中进行任何处理,那么你最好在外部类中处理这个异常。

相关问题