Spring与Mybatis整合后的SQL异常捕获

优秀文章

博客:永生天地 > Spring的DataAccessException


相关框架

后台:Spring,Mybatis


记录原因

在整理数据持久层的异常规范时,对异常java.sql.SQLSyntaxErrorException进行捕获发现使用其父类java.sql.SQLException无法实现,若使用java.sql.Exception进行捕获可以实现但异常定位将不准确,后经过了解发现Spring只支持抛出org.springframework.dao.DataAccessException异常,该异常与实际异常java.sql.SQLSyntaxErrorException父类不相同,因此无法捕获;


解析异常
************
演示类:SQLSyntaxErrorException
访问修饰:public
完整名称:java.sql.SQLSyntaxErrorException
************
演示类的父类:SQLNonTransientException
访问修饰:public
完整名称:java.sql.SQLNonTransientException
************
演示类的父类的父类:SQLException
访问修饰:public
完整名称:java.sql.SQLException
************
演示类的父类的父类的接口:Iterable
访问修饰:public abstract interface
完整名称:java.lang.Iterable
************
演示类的父类的父类的父类:Exception
访问修饰:public
完整名称:java.lang.Exception
************
演示类的父类的父类的父类的父类:Throwable
访问修饰:public
完整名称:java.lang.Throwable
************
演示类的父类的父类的父类的父类的接口:Serializable
访问修饰:public abstract interface
完整名称:java.io.Serializable
************
演示类的父类的父类的父类的父类的父类:Object
访问修饰:public
完整名称:java.lang.Object
************
演示类:DataAccessException
访问修饰:public abstract
完整名称:org.springframework.dao.DataAccessException
************
演示类的父类:NestedRuntimeException
访问修饰:public abstract
完整名称:org.springframework.core.NestedRuntimeException
************
演示类的父类的父类:RuntimeException
访问修饰:public
完整名称:java.lang.RuntimeException
************
演示类的父类的父类的父类:Exception
访问修饰:public
完整名称:java.lang.Exception
************
演示类的父类的父类的父类的父类:Throwable
访问修饰:public
完整名称:java.lang.Throwable
************
演示类的父类的父类的父类的父类的接口:Serializable
访问修饰:public abstract interface
完整名称:java.io.Serializable
************
演示类的父类的父类的父类的父类的父类:Object
访问修饰:public
完整名称:java.lang.Object

实现

Mapper

List search(String str) throws DataAccessException;

Service

    // 我是直接在Service处理异常(也可直接抛出不在此处理),处理方式是抛出新的异常(注释处),细节已省略;
    public List search(String str) /*throws ServiceException*/ {
        try {
            return mapper.search(str);
        } catch (DataAccessException e) {
            // 处理异常
            ...
            //throw new ServiceException(e.getMessage(), e);
        }
    }
最后
  • 一个异常的抛出并不一定以其本身或超类的形式传递,因此要捕获该异常不可绝对的认为用其本身或超类可以捕获,也不可笼统的使用java.lang.Exception,追根溯源,找到其准确的传递形式才能正确的捕获并定位该异常;

你可能感兴趣的:(Spring与Mybatis整合后的SQL异常捕获)