Единообразная обработка исключений с помощью перехватчиков

Spring Boot

Как бизнесмен, вы обязательно столкнетесь с обработкой исключений в коде бизнес-интерфейса, таких как исключения с логикой кода, исключения в бизнес-логике и так далее. Этих аномальных сценариев очень и очень много. С таким количеством логики исключений, с которыми нужно иметь дело, это означает писать много повторяющегося кода. Как бизнесмен, который немного преследует, он не может просто понять CURD. Конечно, он надеется чтобы код выглядел лаконично и удобно.

В этой статье мы хотим рассказать об эволюции автора в обработке исключений, а затем привести пример унифицированной обработки исключений.

Первоначальный метод заключается в определении класса бизнес-исключения.Когда бизнес-исключение перехвачено, используйте код ошибки исключения и информацию об ошибке для создания подсказки об ошибке и возврата.

/**
* 错误码枚举类
*/
public enum ResponseCode {
    SUCCESS(0, "OK"),
    SERVER_ERROR(1, "server error");

    private int code;
    private String msg;

    ResponseCode(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public int getCode() {
        return code;
    }

    public ResponseCode setCode(int code) {
        this.code = code;
        return this;
    }

    public String getMsg() {
        return msg;
    }

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

/**
* 自定义业务异常类
*/
public class BizException extends RuntimeException {

    private final int code;

    public BizException(ResponseCode errCode) {
        super(errCode.getMsg());
        this.code = errCode.getCode();
    }

    public BizException(ResponseCode errCode, String msg) {
        super(msg);
        this.code = errCode.getCode();
    }

    public BizException(int code, String msg) {
        super(msg);
        this.code = code;
    }

    public int getCode() {
        return this.code;
    }

}

class TestService {
	public void testAMethod() {
		// 业务异常代码
		throw new BizException(ResponseCode.BIZ_CODE);
	}
}

/**
* 接口返回的通用结构HttpResult
* {"code": 0, "msg": "OK"}
*/
class TestController {

	@Autowired
	private TestService testService;

	public HttpResult testA() {
		try {
			testService.testAMethod();
		} catch (BizException e) {
			return HttpResult(e.getCode(), e.getMsg());
		} catch (Exception e) {
			return HttpResult(ResponseCode.SERVER_ERROR);
		}

		return HttpResult(ResponseCode.SUCCESS);
	}

}

Позже выяснилось, что необходима оптимизация.Во-первых, с увеличением количества бизнес-кодов эти try...catch выглядели раздутыми.

Во-вторых, когда в нижележащем коде есть исключение, оно должно быть перехвачено во внешнем слое, а затем выброшено слой за слоем, пока при возврате бизнес-интерфейс не вернет сообщение об ошибке, если это интерфейс с особенно сложной бизнес-логикой. , код обработки исключений будет распространяться по всей системе, из-за чего эти коды исключений выглядят неприглядно, а код становится менее читаемым.

Со временем я задумался, существует лиПерехватчик проверкиТочно так же эти суждения обрабатываются единообразно в одном месте, чтобы код выглядел красивее.ответ да, это использоватьExceptionHandlerа такжеRestControllerAdviceаннотация.

Сначала определите класс:SpringMvcExceptionDemo, класс плюсRestControllerAdviceАннотация, в классе определен метод exceptionHandler, и метод имеет префиксExceptionHandlerAnnotation, а затем вы можете написать логику оценки исключения в методе и соответствующим образом обработать логику исключения.

Конкретный пример кода реализации выглядит следующим образом:


@RestControllerAdvice
public class SpringMvcExceptionDemo {

    @ExceptionHandler
    public Object exceptionHandler(Exception e, HttpServletRequest request, HttpServletResponse response) {
        if (e instanceof BizException) {
            BizException be = (BizException) e;
            return new HttpResult(be.getCode(), be.getMessage());
        }
        if (e instanceof IllegalArgumentException) {
            return new HttpResult(ResponseCode.PARAM_ERROR.getCode(), e.getMessage());
        }

        return new HttpResult(ResponseCode.SERVER_ERR);
    }

}

public HttpResult testA() {
	testService.testAMethod();
	return HttpResult(ResponseCode.SUCCESS);
}

Таким образом, необходимо генерировать исключения только в том месте, где генерируются бизнес-исключения, а перехватчики могут обрабатывать исключения единообразно, что сокращает количество повторяющегося кода и улучшает читаемость кода.

RestControllerAdvice и обработчик исключений

RestControllerAdvice — это аннотация в среде Spring, эта аннотация содержитControllerAdviceа такжеResponseBody, что помогает нам, добавляя точку пересеченияExceptionHandlerдля обработки исключений в RestfulAPI. Время выполнения равноdoDispatch, вызовprocessDispatchResultметод, если есть исключение, он будет вызван добавленнымExceptionHandlerМетод аннотации судить.

Блок-схема выглядит следующим образом:

Код основной обработки:

for (HandlerExceptionResolver handlerExceptionResolver : this.handlerExceptionResolvers) {
	exMv = handlerExceptionResolver.resolveException(request, response, handler, ex);
	if (exMv != null) {
		break;
	}
}

Суммировать

Код и принцип относительно просты. Целью единообразной обработки исключений является устранение повторяющихся блоков кода и написание более лаконичного кода. Теперь написание кода также настаивает на этой идее. Я надеюсь изучить больше навыков, и другие навыки приветствуются. Обсудить .

Оригинал статьи, ограниченный стиль написания, недостаток знаний и знаний, если есть неточности в статье, сообщите пожалуйста.

Если статья была вам полезна, ставьте лайк, спасибо

Для более интересного контента, пожалуйста, обратите внимание на личный публичный номер.