SSM 통합 상세 티칭(중)

여기에 이미지 설명 삽입

3. 예외 처리기

문제 수입

질문 1: 프로젝트의 모든 레벨에서 예외가 발생할 수 있는데 예외 처리 코드는 어느 레벨에서 작성됩니까?

1 예외 소개

  • 비정상적인 현상은 프로그램 개발 과정에서 필연적으로 발생하며 사용자가 이러한 페이지 데이터를 볼 수 없습니다.

이미지-20210805172011686

  • 비정상적인 현상의 일반적인 위치와 일반적인 원인은 다음과 같습니다.
    • 프레임워크 내에서 발생한 예외: 비준수 사용으로 인해 발생함
    • 데이터 레이어에서 발생하는 예외: 외부 서버 오류로 인해 발생(예: 서버 액세스 시간 초과)
    • 비즈니스 계층에서 발생하는 예외: 비즈니스 로직 쓰기 오류로 인해 발생(예: 비즈니스 쓰기 작업 트래버스, 인덱스 예외 발생 등)
    • 프리젠테이션 계층에서 발생하는 예외: 데이터 수집 및 확인과 같은 규칙으로 인해 발생(예: 일치하지 않는 데이터 유형으로 인해 발생하는 예외)
    • 도구 클래스에 의해 발생한 예외: 도구 클래스의 부정확한 작성 및 충분히 강력하지 않은 경우(예: 해제해야 하는 연결이 오랫동안 해제되지 않은 경우 등)

2 예외 처리기

2.2.1 예외 처리기 작성

@RestControllerAdvice  //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
    
    

    //统一处理所有的Exception异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
    
    
        return new Result(666,null);
    }
}

예외 처리기 사용의 효과

이미지-20210805171924452

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을 전달하고 다음 결과를 얻습니다.

이미지-20210805173815730

Supongo que te gusta

Origin blog.csdn.net/qq_51808107/article/details/130540953
Recomendado
Clasificación