JPA中更好的异常处理

Mar*_*ada 16 java ejb-3.0 jpa-2.0

我在持久化实体时使用了EJB3/JPA,我很高兴它能够管理我的数据库相关任务.我唯一关心的是异常处理.保存实体时的示例代码总是有这种风格.我在网上阅读的大多数教程都有这种风格,也不考虑异常处理.

@Stateless
public class StudentFacade{
    @PersistenceContext(unitName = "MyDBPU")
    private EntityManager em;

    public void save(Student student) {
        em.persist(student);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道EJB应用程序中最好的异常处理方式是什么?处理异常时最好的方法是什么?

这是其他人如何处理异常?会话外观上的try catch块?

@Stateless
public class StudentFacade{
    @PersistenceContext(unitName = "MyDBPU")
    private EntityManager em;

    public void save(Student student) {
        try {
            em.persist(student);
        } catch(Exception e) {
            //log it or do something
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或让该方法抛出异常?

public void save(Student student) throws Exception {
    em.persist(student);
}
Run Code Online (Sandbox Code Playgroud)

我不知道我的理解是否正确,因为我还在学习EJB.谢谢

Nav*_*abu 12

异常处理的想法是在任何失败的情况下在一个点上做一些逻辑.try catch将在您需要处理异常的最后一点使用,或者您需要将异常转换为另一个异常

说你的应用程序有很多层,即Action,Facade,Persist

委托异常 在这种情况下,Facade上引发的任何异常都可以抛出到上面的操作层.在操作中,将捕获特定异常并使用正确的错误消息进行处理.

//This is in Facade Layer
public void save(Student student) throws AppException{
    //exceptions delegated to action layer

    //call to Persist Layer
}
Run Code Online (Sandbox Code Playgroud)

将常规异常转换为应用程序异常 在持久性中说你得到和DBException一样sqlException.不应将此异常作为Action或Facade层发送,因此我们捕获特定异常然后抛出一个新异常(用户定义的应用程序异常)

//This is in Persist Layer
public void save(Student student) throws AppException{
        //converting general exception to AppException and delegating to Facade Layer

        try{
            em.persist(student);//call to DB. This is in Persist Layer
        }catch(Exception e){
            throw new AppException("DB exception", e)
        }
    }
Run Code Online (Sandbox Code Playgroud)

在操作层中 您将捕获您的异常,然后在那里处理异常

  //This is in Action layer
  public void callSave(Student student){
            try{
                //call Facade layer
            }catch(AppException e){
               //Log error and handle
            }
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果持久层是EJB,那么您的方法不起作用,因为在方法返回后提交时会发生许多异常. (3认同)