優(yōu)秀文章
博客:永生天地 > Spring的DataAccessException
相關(guān)框架
后臺:Spring,Mybatis
記錄原因
在整理數(shù)據(jù)持久層的異常規(guī)范時(shí),對異常java.sql.SQLSyntaxErrorException進(jìn)行捕獲發(fā)現(xiàn)使用其父類java.sql.SQLException無法實(shí)現(xiàn)渠脉,若使用java.sql.Exception進(jìn)行捕獲可以實(shí)現(xiàn)但異常定位將不準(zhǔn)確,后經(jīng)過了解發(fā)現(xiàn)Spring只支持拋出org.springframework.dao.DataAccessException異常委乌,該異常與實(shí)際異常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
實(shí)現(xiàn)
Mapper
List<Model> search(String str) throws DataAccessException;
Service
// 我是直接在Service處理異常(也可直接拋出不在此處理)残制,處理方式是拋出新的異常(注釋處)立砸,細(xì)節(jié)已省略;
public List<Model> search(String str) /*throws ServiceException*/ {
try {
return mapper.search(str);
} catch (DataAccessException e) {
// 處理異常
...
//throw new ServiceException(e.getMessage(), e);
}
}
最后
- 一個(gè)異常的拋出并不一定以其本身或超類的形式傳遞初茶,因此要捕獲該異常不可絕對的認(rèn)為用其本身或超類可以捕獲颗祝,也不可籠統(tǒng)的使用java.lang.Exception,追根溯源恼布,找到其準(zhǔn)確的傳遞形式才能正確的捕獲并定位該異常螺戳;