摘要:前言一般我們后臺出錯報都是直接拋出來的,但是微信公眾號,或者支付寶支付等等,他們的異常都有錯誤碼對應錯誤信息,他們是如何根據錯誤信息展示對應的錯誤碼提供給前端的呢,這也就是我們要說的統一錯誤消息處理機制。
1、前言
一般我們后臺出錯報Exception都是直接拋出來的,但是微信公眾號,或者支付寶支付等等,他們的異常都有錯誤碼對應錯誤信息,他們是如何根據錯誤信息展示對應的錯誤碼提供給前端的呢,這也就是我們要說的統一錯誤消息處理機制。
2、Java實現首先創建一個Result類,這個類作用是設置消息碼以及消息文本還有消息數據,如下所示
package com.xfind.util.result; public class Result{ private int code; private String message; private T data; public Result(){ } public Result(int code, String message, T data) { this(code, message); this.data = data; } public Result(int code, String message) { this.code = code; this.message = message; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getData() { return data; } public void setData(T data) { this.data = data; } }
設置之后 ,我們接下來再創建一個ResultCode類,這個類的作用是具體的消息碼和消息,如下所示:
package com.xfind.util.result; /** * 異常處理狀態碼 */ public enum ResultCode { SUCCESS(0, "請求成功"), Unknown_Exception(-1, "未知異常"), USER_NOT_FOUND(10001, "沒有找到此用戶"), USERNAME_NOT_BLANK(10002, "用戶名不能為空"), USERNAME_EXIST(10003, "用戶名已經存在"), USERTYPE_ERROR(100031, "用戶類型不正確"), PHONE_WROND(10004, "手機號不正確"), SMS_CODE_ERROR(10007, "手機驗證碼不正確"), PHONE_EXIST(10008, "手機號已經存在"), USER_EMPTY_EXCEPTION(10009, "用戶名、手機號或者郵箱為空"), USER_TOKEN_EXCEPTION(10010, "從TOKEN中未查到相關用戶信息"), USERNAME_PASSWORD_EXCEPTION(10011, "用戶名或者密碼錯誤"), EMAIL_SERVER_ECCEPTION(10012, "阿里云郵件服務端出錯"), EMAIL_CLIENT_ECCEPTION(10013, "阿里云郵件客戶端出錯"), EMAIL_SEND_ECCEPTION(10014, "阿里云郵件發送出錯"), EMAIL_WROND(10015, "郵箱不正確"), EMAIL_CODE_WROND(10016, "郵箱驗證碼不正確"), EMAIL_EXIST(10017, "郵箱已經存在"), LOGIN_METHOD_WROND(10018, "登錄方式不正確"), CODE_EMPTY(10019, "驗證碼不為空"), PASSWORD_EMPTY(10020, "密碼不為空"), TOKEN_EXCEPTION(10021, "TOKEN認證出錯"), USER_AUTH_FAILD(10022, "用戶認證失敗"), USER_ACCESS_DENIED(10023, "用戶無權限登錄"), CODE_SEND_FAILD(10030, "驗證碼發送失敗"), ACTION_MONGODB_ERROR(10100, "操作MONGODB數據庫出錯"), OPERATION_TOO_FREQUENT(10101, "請求過于頻繁,請稍候再試"), GOLD_COINS_INSUFFICIENT(10025,"金幣余額不足"), CODE_EXIST(10023,"編號已存在"), TESTCODE_EXIST(10033,"答題碼已存在"), TESTCODE_NOEXIST(10034,"答題碼不存在"), TESTCODE_ERROR(10036,"提交數已達上限"), TESTCENTER_NOEXIST(10035,"測試題不存在"), NAME_EXIST(10024,"名稱已存在"), NOT_EXIST_EMAIL(10025,"該企業用戶沒有分配郵箱"), MAIL_REACH_MAX(10026,"達到收取郵箱上限"), MAIL_NEW_NOTEXIST(10027,"郵箱中沒有可導入的簡歷"), PWD_CONFIRM_ERROR(10029,"兩次密碼不一致"), PWD_ERROR(10030,"密碼不正確"), ENTER_OR_TALENT_NOT_EXITS(10028,"企業或人才庫簡歷不存在"), PHONE_EMPTY(10031, "手機號不能為空"), EMAIL_EMPTY(10032, "郵箱不能為空"), NO_USABLE_MAIL(10040,"沒有可用郵箱"), REQUESTRECORD_EXIST(10050,"簡歷已投遞"), TALENTRESERVER_EXIST(10051,"簡歷已存在于人才儲備庫中,請勿重復添加"), DEVICE_ID_EMPTY(10052,"設備ID:deviceId不能為空"), DELETE_CONNECT_ERROR(10053,"刪除connect出錯"); private int code; private String message; ResultCode(int code, String message) { this.code = code; this.message = message; } public int getCode() { return code; } public String getMessage() { return message; } }
好了,有了Result和ResultCode類,我們就可以來編寫異常并返回給前端了,不過在這之前我們還要創建兩個類:DomainException和SuccessResult,
package com.xfind.exception; import com.xfind.util.result.ResultCode; public class DomainException extends RuntimeException { private int errCode = ResultCode.Unknown_Exception.getCode(); public DomainException() { super(ResultCode.Unknown_Exception.getMessage()); } public DomainException(ResultCode resultCode) { super(resultCode.getMessage()); this.errCode = resultCode.getCode(); } public int getErrCode() { return errCode; } public void setErrCode(int errCode) { this.errCode = errCode; } }
DomainException的作用是要拋出的異常類,從代碼中可以看出它是繼承RuntimeException類的,所以可以使用throw new DomainException(ResultCode.XX);這樣就可以拋到前端。
package com.xfind.util.result; public class SuccessResultextends Result { public SuccessResult(){ } public SuccessResult(T data) { super(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data); } }
這個類的作用是輔助類,把Code和Message都封裝到這個類,就可以直接返回到前端了。
3、設置統一異常處理我們再添加一個GlobalExceptionHandler類,來處理每個拋出DomainException類返回的數據,前返回Result給前端了,如下所示:
/** * 統一異常處理 */ @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = DomainException.class) public Result domainExceptionHandler(HttpServletRequest req, DomainException e) throws Exception { e.printStackTrace(); Result result = new Result(e.getErrCode(), e.getMessage()); return result; } }4、測試
現在我們編寫一個類來測試我們剛剛寫的類的運行情況,如下所示
@GetMapping("/isRegister") public ResponseEntity isRegister(@RequestParam String user) { boolean has_phone = smsService.isExist(user); if (has_phone) { throw new DomainException(ResultCode.PHONE_EXIST); } boolean has_email = emailService.isExist(user); if (has_email) { throw new DomainException(ResultCode.EMAIL_EXIST); } String str = "該手機號或者郵箱沒有被注冊,可以注冊本系統"; Result result = new SuccessResult<>(str); return ResponseEntity.ok(result); }
該方法是判斷用戶是否已經被注冊,方法里面先判斷是否有相同手機或者郵箱,如果有就招聘異常給前端,否則則返回正確信息給前端,我們使用POSTMan來測試下
1)首先我們輸入一個已經存在的手機號
2)我們再輸入一個已經存在的郵箱
3)我們再輸入一個不存在存在的手機
5、總結1、首先建立一個錯誤碼和錯誤消息類,然后再把消息返回,返回的時候要設置成JSON拋給前端
2、我這里的消息碼使用的是int,你也可以設置成String,這個看你需求了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77359.html
摘要:中國開發者的年度盛會中國開發者大會,于年月日在杭州舉辦了本年度的杭會議我們的和將為在現場為您帶來現場的報道,一覽大牛風采,直擊技術熱點。簽到中第日的會議即將開幕以下是與參會者和與博文視點的作者們合影 中國JS開發者的年度盛會JS中國開發者大會,于2014年6月21日在杭州舉辦了本年度的杭JS會議! 我們SegmentFault的 @integ 和 @shamiao 將為在現場為您帶來...
摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...
摘要:版本升級每個文件方法頭標明版本號,每次修改需修改版本號大于原版本號,即為版本升級。 這些天項目有的API出現版本控制問題,著實忙乎了一小陣,因為項目使用TP5的傳統方法進行版本控制(api目錄下進行版本區分,由請求路徑決定使用的版本) showImg(https://segmentfault.com/img/bVbekSM?w=200&h=128); 但是問題往往是,項目使用了v2版本...
摘要:今天松哥就帶大家來看看的使用。此時啟動前端項目,就可以順利發送網絡請求了。松哥將自己封裝的網絡請求庫已經放在上,歡迎大家參考。前端網絡訪問,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,網絡訪問較多的采用 vue-resources,Vue2.0 之后,官方不再建議使用 vue-resources ,這個項目本身也停止維護,目前建議使用的方案是 axios。今天松哥就帶大...
閱讀 960·2023-04-25 23:54
閱讀 3043·2021-11-08 13:21
閱讀 3769·2021-09-27 13:35
閱讀 3390·2021-07-26 23:41
閱讀 1053·2019-08-30 15:52
閱讀 3438·2019-08-30 11:27
閱讀 2097·2019-08-29 18:37
閱讀 536·2019-08-29 17:24