우아한 봄 프로젝트 예외를 처리하는 방법

무슨 일이 비정상인가?

Java中的异常(Exception)又称为例外,是一个在程序执行期间发生的事件,它中断正在执行的程序的正常指令流。
复制代码

가장 일반적인 문은 프로그램 실행시, 실행중인 프로그램을 중단 다양한 경우가 있었다이다. 예를 들어, 0은 피제수로서 사용되지 않기 때문에, 당신은 0~1의 제거와 나누기 함수 계산기를 사용하고 있으므로, 이상 동작은이다. 프로그램에서 프로그래머 오류는 존재하지 않는 파일을 열려고 시도하는 등, 예를 들어, 잘못된 데이터 사용자의 예기치 못한 상황이나 프로그래머의 제어 범위를 벗어난 환경에서 발생할 수 있습니다.

这里再做一下java中的异常分类:
复制代码

자바에서 모든 예외는 공통 조상의 Throwable (throw 가능 객체)가 있습니다. 의 Throwable있는 일반적인 문제 자바 응용 프로그램을 통해 전송의 변칙적 인 전파 메커니즘에서 사용할 수있는 코드를 지정합니다.

Throwable:有两个重要的子类:Exception(异常)和Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。

Exception(异常):是程序本身可以处理的异常。
Exception类有一个重要的子类RuntimeException。RuntimeException类及其子类表示“JVM常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
复制代码

컴파일러 (이상)가 실행 특이 및 비 - 실행 예외 (이상) 예외는 두 개의 카테고리로 나누어. 프로그램은 가능한 한 이러한 예외를 처리 할 수 ​​있어야합니다.

1.运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

2.非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
复制代码

우리는 기본 원칙, 우리는 과정을 캡처하는 것을 시도해야 알려진 예외를 유지하기 위해 특별한 방법으로 처리, 알 수없는 예외가 바깥쪽으로 원칙적으로 자신의 예외를 처리하기 위해 제공 외부 서비스, 외국인 직접 노출 예외를 줄여야 발생합니다. 위의 이론적 소개의 일부, 다음은 직접하는 방법을 프로젝트 캡처 메커니즘과 상호 작용하는 첫 페이지에 글로벌 이상을 사용하는 방법을 알려, 일부 코드입니다.

먼저 우리는, 추상 기본 예외 클래스를 만들고 다른 예외 처리의 차이를 구현

공공 추상 클래스 BaseException이의 RuntimeException을 {확장

public BaseException(int code) {
    super(String.valueOf(code));
}

public BaseException(int code, Throwable cause) {
    super(String.valueOf(code), cause);
}

public BaseException(String msg) {
    super(msg);
}

public BaseException(String msg, Throwable cause) {
    super(msg, cause);
}

protected BaseException(int code, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    super(String.valueOf(code), cause, enableSuppression, writableStackTrace);
}
复制代码

}

사용자 정의 예외 클래스, 비즈니스 예외 잡은 제외한 모든. 물론, 당신은 또한 자신의 프로젝트, 사용자 정의 다양한 예외 유형이 필요할 수 있습니다. 예를 들어, 시스템의 오동작과 같은 데이터 처리 예외의 관점에서 정의되고있다.

공용 클래스 BusinessException는 BaseException을 {확장

public BusinessException(int code) {
    super(code);
}

public BusinessException(int code, Throwable cause) {
    super(code, cause);
}

public BusinessException(String msg, Throwable cause) {
    super(msg, cause);
}

public BusinessException(String msg) {
    super(msg);
}

protected BusinessException(int code, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    super(code, cause, enableSuppression, writableStackTrace);
}
复制代码

}

공용 클래스 DBException는 BaseException을 {확장

public BusinessException(int code) {
    super(code);
}

public BusinessException(int code, Throwable cause) {
    super(code, cause);
}

public BusinessException(String msg, Throwable cause) {
    super(msg, cause);
}

public BusinessException(String msg) {
    super(msg);
}

protected BusinessException(int code, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    super(code, cause, enableSuppression, writableStackTrace);
}
复制代码

}

공용 클래스 ResponseObject {

/**
 * 正常返回的状态码
 */
private static final String NORMAL_CODE = "0";

/**
 * 正常返回的描述
 */
private static final String NORMAL_MSG = "正常";

/**
 * 接口返回码
 */
private String statusCode;

/**
 * 接口返回描述
 */
private String msg;

/**
 * 接口响应的实际数据
 */
private Object data;

public String getStatusCode() {
    return statusCode;
}

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

public String getMsg() {
    return msg;
}

public void setMsg(String msg) {
    this.msg = msg;
}

public Object getData() {
    return data;
}

public void setData(Object data) {
    this.data = data;
}

public ResponseObject(String statusCode, String msg) {
    this.statusCode = statusCode;
    this.msg = msg;
}
复制代码

}

클래스있어서, 주석 @ControllerAdvice @ExceptionHandler 수정 된 방법 어노테이션하는 방법은, 대응하는 비정상 처리에 해당 할 것이다

@ControllerAdvice

공용 클래스 GlobalExceptionHandler {

/**
 * 业务操作异常
 */
private static final String UNNORMAL_EXCEPTION_CODE = "100001";

/**
 * 数据库查询异常
 */
private static final String DB_EXCEPTION_CODE = "100002";

@ExceptionHandler(value = BusinessException.class)
@ResponseBody
public ResponseObject businessExceptionHandler(HttpServletRequest req, Exception e) {
    String code = UNNORMAL_EXCEPTION_CODE;
    String msg = "业务操作异常";
    return new ResponseObject(code, msg);
}
@ExceptionHandler(value = DBException.class)
@ResponseBody
public ResponseObject businessExceptionHandler(HttpServletRequest req, Exception e) {
    String code = DB_EXCEPTION_CODE;
    String msg = "数据库查询异常";
    return new ResponseObject(code, msg);
}
复制代码

}

설명이 두 노트 확장

// 메소드 주석으로 객체의 역할

런타임에 유효한 @Target ({ElementType.METHOD}) //

@Retention (RetentionPolicy.RUNTIME)

@Documented

공공 @interface ExceptionHandler {

//value()可以指定异常类

Class<? extends Throwable>[] value() default {};
复制代码

}

@Target ({} ElementType.TYPE)

@Retention (RetentionPolicy.RUNTIME)

@Documented

// 빈은 관리를 생성하는 봄 객체

@구성 요소

공공 @interface의 ControllerAdvice {

@AliasFor("basePackages")

String[] value() default {};

@AliasFor("value")
String[] basePackages() default {};

Class<?>[] basePackageClasses() default {};

Class<?>[] assignableTypes() default {};

Class<? extends Annotation>[] annotations() default {};
复制代码

}

주의

1. 예외가 마지막 층은 글로벌 예외 핸들러에 처리 할 수있는 콘트롤에서 발생되는 한, 그 자체를 GlobalExceptionHandler 처리 컨트롤러 레이어 예외가 발생하지 않는다.

2. 비동기 예외 처리 예외의 방법은 글로벌되지 않습니다.

예외가 잡힌 코드 시도 / 잡기에 던져 경우 3. GlobalExceptionHandler은 처리되지 않습니다.

요약 :

이점

코드 중복, 유지 보수에 대한 코드를 감소

결점

단지 예를 들어, 컨트롤러 레이어를 던져 예외를 처리 할 수,

예외 인터셉터 (인터셉터) 층, 타이머 태스크에 이상 비정상적인 비동기있어서, 처리하지 않는다.

추천

출처juejin.im/post/5d478bdc6fb9a06b1e7f2001