SSM 통합 상세 티칭(중)
3. 예외 처리기
문제 수입
질문 1: 프로젝트의 모든 레벨에서 예외가 발생할 수 있는데 예외 처리 코드는 어느 레벨에서 작성됩니까?
1 예외 소개
- 비정상적인 현상은 프로그램 개발 과정에서 필연적으로 발생하며 사용자가 이러한 페이지 데이터를 볼 수 없습니다.
- 비정상적인 현상의 일반적인 위치와 일반적인 원인은 다음과 같습니다.
- 프레임워크 내에서 발생한 예외: 비준수 사용으로 인해 발생함
- 데이터 레이어에서 발생하는 예외: 외부 서버 오류로 인해 발생(예: 서버 액세스 시간 초과)
- 비즈니스 계층에서 발생하는 예외: 비즈니스 로직 쓰기 오류로 인해 발생(예: 비즈니스 쓰기 작업 트래버스, 인덱스 예외 발생 등)
- 프리젠테이션 계층에서 발생하는 예외: 데이터 수집 및 확인과 같은 규칙으로 인해 발생(예: 일치하지 않는 데이터 유형으로 인해 발생하는 예외)
- 도구 클래스에 의해 발생한 예외: 도구 클래스의 부정확한 작성 및 충분히 강력하지 않은 경우(예: 해제해야 하는 연결이 오랫동안 해제되지 않은 경우 등)
2 예외 처리기
2.2.1 예외 처리기 작성
@RestControllerAdvice //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
//统一处理所有的Exception异常
@ExceptionHandler(Exception.class)
public Result doOtherException(Exception ex){
return new Result(666,null);
}
}
예외 처리기 사용의 효과
2.2.2 @RestControllerAdvice 주석 소개
-
이름: @RestControllerAdvice
-
유형:클래스 주석
-
위치: Rest 스타일 개발을 위한 컨트롤러 향상 클래스 정의 위
-
역할: Rest 스타일로 개발된 컨트롤러 클래스 강화
-
설명: 이 주석은 해당 기능이 있는 @ResponseBody 주석 및 @Component 주석과 함께 제공됩니다.
2.2.3 @ExceptionHandler 주석 소개
- 이름: @ExceptionHandler
- 유형:메서드 주석
- 위치: 예외 처리 전용 컨트롤러 메서드 위
- 기능: 지정된 예외에 대한 처리 계획을 설정합니다.이 기능은 컨트롤러 메서드와 동일합니다.예외가 발생하면 원래 컨트롤러의 실행이 종료되고 실행을 위해 현재 메서드로 전송됩니다.
- 설명: 이 메서드는 처리된 예외에 따라 해당 예외를 처리하는 여러 메서드를 만들 수 있습니다.
4. 프로젝트 예외 처리 계획
문제 수입
프로젝트의 현재 예외 분류와 해당 유형의 예외 처리 방법을 알려주십시오.
1 아이템 이상 분류
- 비즈니스 예외(BusinessException)
- 정상적인 사용자 행동에 의해 생성된 이상 현상
- 비정상적인 사용자 행동 조작으로 인한 이상
- 시스템 예외(SystemException)
- 프로젝트 운영 중 예측 가능하고 불가피한 예외 사항
- 기타 예외(예외)
- 프로그래머가 예상하지 못한 예외
2 프로젝트 예외 처리 체계
- 비즈니스 예외(BusinessException)
- 표준 작동을 상기시키기 위해 해당 메시지를 사용자에게 보냅니다.
- 시스템 예외(SystemException)
- 사용자를 달래기 위해 사용자에게 고정 메시지를 보냅니다.
- 유지 보수를 상기시키기 위해 운영 및 유지 보수 담당자에게 특정 메시지를 보냅니다.
- 기록 로그
- 기타 예외(예외)
- 사용자를 달래기 위해 사용자에게 고정 메시지를 보냅니다.
- 유지 보수를 상기시키기 위해 프로그래머에게 특정 메시지 보내기(예상 범위에 포함됨)
- 기록 로그
3 프로젝트 예외 처리 코드 구현
3.1 예외 분류를 기반으로 예외 클래스 사용자 지정
3.1.1 사용자 지정 프로젝트 시스템 수준 예외
//自定义异常处理器,用于封装异常信息,对异常进行分类
public class SystemException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public SystemException(Integer code, String message) {
super(message);
this.code = code;
}
public SystemException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
}
}
3.1.2 사용자 지정 프로젝트 비즈니스 수준 예외
//自定义异常处理器,用于封装异常信息,对异常进行分类
public class BusinessException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public BusinessException(Integer code,String message,Throwable cause) {
super(message, cause);
this.code = code;
}
}
3.2 사용자 지정 예외 코딩(지속적인 보충)
public class Code {
//之前其他状态码省略没写,以下是新补充的状态码,可以根据需要自己补充
public static final Integer SYSTEM_ERR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
public static final Integer SYSTEM_UNKNOW_ERR = 59999;
public static final Integer BUSINESS_ERR = 60002;
}
3.3 사용자 지정 예외 트리거
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
//在getById演示触发异常,其他方法省略没有写进来
public Book getById(Integer id) {
//模拟业务异常,包装成自定义异常
if(id <0){
throw new BusinessException(Code.BUSINESS_ERR,"请不要使用你的技术挑战我的耐性!");
}
}
}
3.4 예외 알림 클래스의 예외 가로채기 및 처리
@RestControllerAdvice //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
//@ExceptionHandler用于设置当前处理器类对应的异常类型
@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException ex){
//记录日志
//发送消息给运维
//发送邮件给开发人员,ex对象发送给开发人员
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex){
return new Result(ex.getCode(),null,ex.getMessage());
}
//除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
@ExceptionHandler(Exception.class)
public Result doOtherException(Exception ex){
//记录日志
//发送消息给运维
//发送邮件给开发人员,ex对象发送给开发人员
return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
}
}
테스트: Postman에서 getById 메서드에 액세스하기 위한 요청을 보내고 매개 변수 -1을 전달하고 다음 결과를 얻습니다.