咱們幾乎已經在咱們的每一個行業標準應用的代碼中處理java自定義異常了。常見的手段是建立一個語義性的繼承基礎exception類的自定義異常類。java
咱們的新方法使用靜態內部類來處理每一個新的異常場景。數據庫
傳統上咱們經過繼承Exception
類來建立一個DBException
。而後每次遇到須要拋出一個與數據庫相關異常的時候,咱們建立一個DBException
的實例,添加一些信息以後拋出它。bash
如今讓咱們考慮如下咱們須要拋出DBException
的場景:單元測試
上述方法的問題在於當這些異常在catch塊或者應用代碼中被處理時,DBException
沒法提供足夠的信息來分別處理上面列出來的異經常使用例。測試
讓咱們爲每個用例建立一個內部類而後把它們組合到DBException
內部來解決上述的問題吧。this
首先建立一個抽象的BaseException
來做爲全部異常類的父類。spa
// BaseException.java
public abstract class BaseException extends Exception{
private String message;
public BaseException(String msg) {
this.message = msg;
}
public String getMessage() {
return message;
}
}
複製代碼
如今建立咱們的Exception
內部類。日誌
// DBExeption.java
public class DBExeption {
public static class BadExecution extends BaseException {
private static final long serialVersionUID = 3555714415375055302L;
public BadExecution(String msg) {
super(msg);
}
}
public static class NoData extends BaseException {
private static final long serialVersionUID = 8777415230393628334L;
public NoData(String msg) {
super(msg);
}
}
public static class MoreData extends BaseException {
private static final long serialVersionUID = -3987707665150073980L;
public MoreData(String msg) {
super(msg);
}
}
public static class InvalidParam extends BaseException {
private static final long serialVersionUID = 4235225697094262603L;
public InvalidParam(String msg) {
super(msg);
}
}
}
複製代碼
這裏咱們建立了許多內部類來處理每一種異常狀況。你能夠根據實際狀況隨意擴展新的異常內部類。code
爲了理解它的做用,如今讓咱們來讓咱們建立一個異常而後拋出它。而後咱們將會在日誌中看見錯誤信息。繼承
// TestExceptions.java
public class TestExceptions {
public static void main(String[] args) {
try
{
throw new DBExeption.NoData("No row found for id : x");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
複製代碼
程序輸出:
Console
com.exception.DBExeption$NoData: No row found for id : x
at com.test.TestExceptions.main(TestExceptions.java:7)
複製代碼
正如你在異常棧中所見的日誌消息,它所攜帶的信息更多更具體了。它清楚展現了錯誤是什麼。在應用代碼之中,你也能夠經過檢查自定義異常實例來作對應的處理。