ERROR:深刻な問題は、我々は処理できません。
例外:RuntimeExceptionをコンパイルチェックを外し、我々はコードを変更する必要があるという問題点があります
非のRuntimeException(CheckedExceptionなし例外クラス)は、プロセスをコンパイルする必要があり、そうでない場合はプログラムがコンパイルすることはできません
Excepitionのデフォルトの非RuntimeExcepition継承カスタム例外。
処理ファイル、ファイルパスエラー:これは、非例外のRuntimeException例で処理してもよいです。
無力のRuntimeException例:データベース要求のデータは、データベースには、このようなデータではありません。
それは十分ではありませんされているJavaに付属している唯一の例外を使用して、すぐにフロントエンドのエラー箇所を容易にするために、バックグラウンドの準備、で。あなたは、ハンドルの例外をカスタマイズする必要があります。
説明を容易にするために、この統一フォーマットエラー応答:
//统一错误响应
{
code:10001
message:xxxx
request:GET url
}
UnifyResponse.class
@Getter
@Setter
@AllArgsConstructor
public class UnifyResponse {
private int code;
private String message;
private String request;
}
この記事の障害は、2つのカテゴリに分類されます。
不明な例外:フロントエンドの開発者とユーザーのためには無意味です。通常、サーバーサイドの開発者コードのロジックの問題。
フロントエンドに戻って詳細な情報を必要とせず、ユーザーが統一内部サーバエラーを表示することができます
既知の異常
知られている例外を定義します。
HttpException.class
public class HttpException extends RuntimeException {
protected Integer code;
protected Integer httpStatusCode = 500;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getHttpStatusCode() {
return httpStatusCode;
}
public void setHttpStatusCode(Integer httpStatusCode) {
this.httpStatusCode = httpStatusCode;
}
}
NotFoundExcepiton.class
public class NotFoundException extends HttpException {
public NotFoundException(int code){
this.httpStatusCode = 404;
this.code = code;
}
}
例外処理:
GlobalExceptionAdvice.class:
@ControllerAdvice
public class GlobalExceptionAdvice {
@Autowired
private ExceptionCodeConfiguration exceptionCodeConfiguration;
//未知异常 错误码就直接硬编码为9999
@ResponseBody
@ExceptionHandler(value = Exception.class)
//如果不加这个注解,传回前端的http状态码会显示200 ok
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
public UnifyResponse handleException(HttpServletRequest req, Exception e) {
UnifyResponse message = new UnifyResponse(9999,"服务器异常",req.getMethod() + ' ' + req.getRequestURI());
//未知异常方便调试,产品上线可以去掉
System.out.println(e);
return message;
}
//已知异常 Http异常其中包含多种异常 错误码由程序员传入例如: throw new NotFoundException(10001);
//为什么不和上面未知异常一样使用@ResponseHandler 因为已知异常有很多种,状态码不一样,不能直接硬编码
//解决办法:在处理各种已知异常的类中添加http状态码,在返回的response中自己添加。使用ResponseEntity
@ExceptionHandler(HttpException.class)
public ResponseEntity<UnifyResponse> handleHttpException(HttpServletRequest req, HttpException e) {
UnifyResponse message = new UnifyResponse(e.getCode(),exceptionCodeConfiguration.getMessage(e.getCode()),req.getMethod() + ' ' + req.getRequestURI());
HttpHeaders httpHeaders = new HttpHeaders();
HttpStatus httpStatus = HttpStatus.resolve(e.getHttpStatusCode());
ResponseEntity<UnifyResponse> r = new ResponseEntity<>(message,httpHeaders,httpStatus);
return r;
}
}
Configurationクラス
既知の異常なエラーコード情報と例外をベースにするために、優れた使用特性の設定クラスにハードコーディングされていません
exception-code.properties
liu.codes[0] = ok
liu.codes[999] = 服务器未知异常
liu.codes[10000] = 通用错误
liu.codes[10001] = 通用参数错误
liu.codes[10002] = 资源未找到
liu.codes[10003] = 没有找到合适的登陆处理方法
liu.codes[10004] = 令牌不合法或者过期
liu.codes[10005] = 用户未被授权
liu.codes[10006] = 登陆失败
liu.codes[20000] = 用户类通用错误
liu.codes[20001] = 用户已存在
liu.codes[20002] = 用户不存在
liu.codes[20003] = 用户密码错误
liu.codes[20004] = 获取用户wx openid失败
liu.codes[30000] = 商品类通用错误
liu.codes[30001] = 分类不存在
liu.codes[30002] = 商品信息不存
liu.codes[30003] = 主题不存在
liu.codes[30004] = complexity参数错误
liu.codes[30005] = Banner类资源不存在
liu.codes[30006] = 当前暂不支持级联获取sku-list
liu.codes[30007] = 当前暂不支持级联获取spu-list,请调用其他接口
liu.codes[30008] = 当前没有更多的商品信息了
liu.codes[30009] = Grid分类不存在
liu.codes[30010] = 请求的单品列表不存在
liu.codes[30011] = 请求的商品SaleExplain不存在
構成カテゴリを読み取ります。
ExceptionCodeConfiguration.class
@ConfigurationProperties(prefix = "liu")
@PropertySource(value = "classpath:/config/exception-code.properties")
@Component
public class ExceptionCodeConfiguration {
private Map<Integer,String> codes =new HashMap<>();
public Map<Integer, String> getCodes() {
return codes;
}
public void setCodes(Map<Integer, String> codes) {
this.codes = codes;
}
public String getMessage(int code){
return codes.get(code);
}
}
中国のプロパティを読んで文字化け解決
考え:
- ファイル - >設定 - >ファイルのエンコードプロパティファイルのUTF-8エンコーディング、および透明ネイティブからASCIIチックに。
- 後は上記の特性は、内容がそれを再入力、削除、すべての文字化けのファイルを操作することができます。