springboot实现全局异常处理

133 阅读2分钟

案例一

import com.sky.constant.MessageConstant;  
import com.sky.exception.BaseException;  
import com.sky.result.Result;  
import lombok.extern.slf4j.Slf4j;  
import org.springframework.web.bind.annotation.ExceptionHandler;  
import org.springframework.web.bind.annotation.RestControllerAdvice;  
  
import java.sql.SQLIntegrityConstraintViolationException;  
  
/**  
* 全局异常处理器,处理项目中抛出的业务异常  
*/  
@RestControllerAdvice  
@Slf4j  
public class GlobalExceptionHandler {  
  
/**  
* 捕获业务异常  
* @param ex  
* @return  
*/  
@ExceptionHandler  
public Result exceptionHandler(BaseException ex){  
    log.error("异常信息:{}", ex.getMessage());  
    return Result.error(ex.getMessage());  
}  
  
/**  
* 处理SQL异常  
* @param ex  
* @return  
*/  
@ExceptionHandler  
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){  
    //Duplicate entry 'zhangsan' for key 'employee.idx_username'  
    String message = ex.getMessage();  
    if(message.contains("Duplicate entry")){  
        String[] split = message.split(" ");  
        String username = split[2];  
        String msg = username + MessageConstant.ALREADY_EXISTS;  
        return Result.error(msg);  
    }else{  
        return Result.error(MessageConstant.UNKNOWN_ERROR);  
        }  
    }  
}

案例二

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(value = MethodArgumentNotValidException.class)

public Result<List<String>> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {

    List<ObjectError> allErrors = e.getBindingResult().getAllErrors();

    LinkedList<String> errors = Lists.newLinkedList();

    if (!CollectionUtils.isEmpty(allErrors)) {

        allErrors.forEach(objectError -> errors.add(objectError.getDefaultMessage()));

    }



    errorFixedPosition(e);

    log.error("_> 错误原因:");

    log.error("_> {}", e.getMessage());

    log.error("=============================错误打印完毕=============================");

    return Result.error("");

}



/**

 * 处理空指针的异常

 *

 * @param e 参数

 * @return 返回异常信息

 */

@ExceptionHandler(value = NullPointerException.class)

public Result exceptionHandler(NullPointerException e) {

    errorFixedPosition(e);

    log.error("_> 错误原因:");

    log.error("_> {}", e.getMessage());

    log.error("=============================错误打印完毕=============================");

    return Result.error("空指针的异常");

}



/**

 * 处理其他异常

 *

 * @param e 参数

 * @return 返回异常信息

 */

@ExceptionHandler(value = Exception.class)





public Result exceptionHandler(Exception e) {

    errorFixedPosition(e);

    log.error("_> 错误原因:");

    log.error("_> {}", e.getMessage());

    log.error("=============================错误打印完毕=============================");

    return Result.error("其他异常");

}



/**

 * 定位错误发生的位置

 *

 * @param e 错误参数

 */

private void errorFixedPosition(Exception e) {

    final StackTraceElement stackTrace = e.getStackTrace()[0];

    final String className = stackTrace.getClassName();

    final int lineNumber = stackTrace.getLineNumber();

    final String methodName = stackTrace.getMethodName();

    e.printStackTrace();

    log.error("=============================错误信息如下=============================");

    log.error("_> 异常定位:");

    log.error("_> 类[{}] ==> 方法[{}] ==> 所在行[{}]\n", className, methodName, lineNumber);

}



@ExceptionHandler(SQLIntegrityConstraintViolationException.class)

public Result<String> exceptionHandler(SQLIntegrityConstraintViolationException exception){

    log.error(exception.getMessage());

    //这里判断出来是添加员工时出现的异常

    if (exception.getMessage().contains("Duplicate entry")){

        //exception对象分割,同时存储

        String []splitErrorMessage=exception.getMessage().split(" ");

        /**

         * splitErrorMessage数组内存的信息

         * Duplicate entry '新增的账号' for key 'idx_username'

         * 下标位2是新增账号,下标位5是关联的字段名

         */

        String errorMessage = "重复了:" + splitErrorMessage[2];

        return Result.error(errorMessage);

    }

    return Result.error("失败了");

}



@ExceptionHandler(SMTPAddressFailedException.class)

public Result<String> exceptionHandler(SMTPAddressFailedException exception){

    log.info("邮件的格式不对:"+exception.getMessage());

    return Result.error("邮件的格式不对,请再次输入");

}



@ExceptionHandler(RedisConnectionException.class)

public Result<String> exceptionHandler(RedisConnectionException exception){

    log.error("没开redis呢"+exception.getMessage());

    return Result.error("没开redis呢");

}





@ExceptionHandler(FileNotFoundException.class)

public Result<String> exceptionHandler(FileNotFoundException exception){

    log.error("图片挂了:"+exception.getMessage());

    return Result.error("图片挂了");

}



@ExceptionHandler(NotLoginException.class)

public Result<String> exceptionHandler(NotLoginException exception){

    log.error("用户没有登录:"+exception.getMessage());

    return Result.error("NOTLOGIN");

}



@ExceptionHandler(NotRoleException.class)

public Result<String> exceptionHandler(NotRoleException exception){

    log.info("当前账号没有绑定对应角色");

    return Result.error("当前账号没有绑定对应角色!");

}





@ExceptionHandler(CustomerException.class)

public Result<String> exceptionHandler(CustomerException exception){

    log.info("白切鸡在售,请先停售");

    return Result.error("白切鸡在售,请先停售");

}



@ExceptionHandler(NotPermissionException.class)

public Result<String> exceptionHandler(NotPermissionException exception){

    log.info("该账号没有对应权限");

    return Result.error("该账号没有对应权限!");

}



@ExceptionHandler(AmqpIllegalStateException.class)

public Result<String> exceptionHandler(AmqpIllegalStateException exception){

    log.info("消息还没发生,接收者还在等待");

    return Result.error("消息还没发生,接收者还在等待!");

}

@ExceptionHandler(IllegalStateException.class)

public Result<String> exceptionHandler(IllegalStateException exception){

    log.info("定时任务还没启动,现在关不了");

    return Result.error("定时任务还没启动,现在关不了");

}

}