面试题--系统如何处理异常
1. 回答
在项目中如何处理异常?
答:自定义统一异常处理器捕获异常
我们定义一个统一的异常处理器去捕获并处理异常。使用注解@ControllerAdvice和异常处理注解@WxceptionHandler来实现
- 处理自定义异常
程序在编写代码时根据校验结果主动抛出自定义一场类对象,指定详细异常信息,并相应给用户
- 处理未知异常
接口执行过程中的一些运行时异常也会由异常处理器同意捕获,记录异常日志,统一响应给用户
在异常处理器中还可以针对某个异常类型进行单独处理
2. 流程
步骤如下:
1. 定义一个基础异常类,继承RuntimeException接口,重写方法
package com.sky.exception;/*** 业务异常*/
public class BaseException extends RuntimeException {public BaseException() {}public BaseException(String msg) {super(msg);}}
2. 每一个异常类都继承BaseException类,重写方法
package com.sky.exception;/*** 密码修改失败异常*/
public class PasswordEditFailedException extends BaseException{public PasswordEditFailedException(String msg){super(msg);}}
3. 业务处理
/*** 根据id删除分类* @param id*/public void deleteById(Long id) {//查询当前分类是否关联了菜品,如果关联了就抛出业务异常Integer count = dishMapper.countByCategoryId(id);if(count > 0){//当前分类下有菜品,不能删除throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH);}//查询当前分类是否关联了套餐,如果关联了就抛出业务异常count = setmealMapper.countByCategoryId(id);if(count > 0){//当前分类下有菜品,不能删除throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL);}//删除分类数据categoryMapper.deleteById(id);}
4. 定义全局异常捕获器
捕获后端产生的异常信息
package com.sky.handler;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*/@ExceptionHandlerpublic Result exceptionHandler(BaseException ex){log.error("异常信息:{}", ex.getMessage());return Result.error(ex.getMessage());}@ExceptionHandlerpublic Result exceptionHandler(SQLIntegrityConstraintViolationException ex){
// Duplicate entry 'zhangsan' for key 'employee.idx_username'
// 获取异常信息String message = ex.getMessage();
// 截取到username字段,将其封装成提示信息给前端提示用户if (message.contains("Duplicate entry")){
// 将错误信息通过空格截取成数组String[] split = message.split(" ");
// 获取数组的第三个元素 :zhangsanString username = split[2];
// 将username与错误信息拼接成最终的错误信息String msg = username + MessageConstant.ALREADY_EXIST;
// 响应给前端return Result.error(msg);}else {return Result.error(MessageConstant.UNKNOWN_ERROR);}}}