java 異常處理(防止因為異常導致系統崩潰)


前言:異常大體分成兩種:已知異常、未知異常

一、已知異常:

      例如:用戶名或密碼錯誤,導致的登陸異常

二、未知異常:

      例如:,輸入框限制只能輸入number, 但輸入了文字、導致的數據類型錯誤,還有空指針、數組越界 等等。通常這些錯誤我們如果沒考慮到就可能會導致系統崩潰、無法繼續執行。

 

如何處理:

     例如用戶登陸,我們利用AOP(面向切面),判斷用戶名、密碼是否正確

     1、聲明狀態碼:

        public class StatusCode(){

             public final static String BUSS_NO_LOGIN = "10101";//未登錄  

             public final static String DEAL_FAIL_MSG_NO_LOGINID = "00202";// 沒有登錄賬號或密碼 

             public final static String DEAL_FAIL_MSG_PASS_ERR = "00203"; // 密碼錯誤   

      }

    2、自定義異常信息(已知異常)

   

/**
* PFT通用型異常
* @author Administrator
*
*/
public class PFTException extends RuntimeException {

private static final long serialVersionUID = -1977245837696067325L;

private String statusCode;

public PFTException(String message) {
super(message);
}

public PFTException(String message, Throwable cause) {
super(message, cause);
}

public PFTException(String statusCode, String message) {
super(message);
this.statusCode=statusCode;
}

public PFTException(String statusCode, String message, Throwable cause) {
super(message,cause);
this.statusCode=statusCode;
}

public String getStatusCode() {
return statusCode;
}

public void setStatusCode(String statusCode) {
this.statusCode = statusCode;
}

public static PFTException build(String statusCode){
return new PFTException(statusCode, StatusCode.getErrorMessage(statusCode));
}

}

    3、利用aop我們對用戶每次對后台的請求進行驗證,如果用戶名密碼不存在或過期拋出 PFTException 

/**
* 檢查是否已經登錄,未登錄時拋出
*/
public void checkLogin() {

if (getCurrentUser()==null){
throw PFTException.build(StatusCode.BUSS_NO_LOGIN);
}
}
4、我們已經把異常拋出了,還沒有進行處理,我們可以在Controller 這一層統一進行處理
①、這里我們也以寫一個基類、來處理異常,其他Controller繼承該類
②、我們需要借用Spring注解 :@ExceptionHandler :統一處理某一類異常,從而能夠減少代碼重復率和復雜度 

public class BaseController {


private static Logger logger = LoggerFactory
.getLogger(BaseController.class);

/**
* 處理service層拋出的異常
*
* @param
*/
@ExceptionHandler(PFTException.class) //這里是處理我們自定義的異常
@ResponseBody
public WebStoreBean handlerServiceException(
PFTException pftException) {
logger.error("發生了{}類型的異常,異常信息為:{}",
pftException.getClass(),
pftException.getMessage());
return WebStoreBean.fail(pftException.getStatusCode());
}

/**
* 處理未知異常
*
* @param exception
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public WebStoreBean handlerException(Exception exception) {
logger.error("發生了{}類型的異常,異常信息為:{}", exception.getClass(),
exception.getMessage());
return WebStoreBean.unknown(exception.getMessage());
}

public String escapeURI(String s){
try {
return java.net.URLDecoder.decode(s,"UTF-8");
} catch (UnsupportedEncodingException e) {
return null;
}
}
}
這樣,發生異常信息后,將由BaseController來統一處理
 
        




    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM