全局异常处理无法处理Filter的异常信息
正文
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.CannotAcquireLockException;
import org.springframework.http.ResponseEntity;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
/**
* @author : zanglikun
* @date : 2021/3/11 13:54
* @Version: 1.0
* @Desc : AOP 思想 统一全局异常处理
*/
@ControllerAdvice // 如果需要关闭全局异常拦截,直接注释此注解即可
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 处理非法参数异常
*
* @param req
* @return
*/
@ExceptionHandler(value = IllegalStateException.class)
@ResponseBody
public ResponseEntity bizExceptionHandler(HttpServletRequest req, IllegalStateException e) {
logger.error("接收了一个非法参数的异常{}",e.getMessage());
return ResponseEntity.badRequest().body("数据传输错误,导致非法参数异常,请联系管理员处理!");
}
/**
* 处理空指针的异常
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = NullPointerException.class)
@ResponseBody
public ResponseEntity exceptionHandler(HttpServletRequest req, NullPointerException e) {
//e.printStackTrace();
logger.error("接收了一个空指针的异常{}",e.getMessage());
return ResponseEntity.badRequest().body("空指针异常,请联系管理员处理!");
}
/**
* 数字格式异常异常处理
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = NumberFormatException.class)
@ResponseBody
public ResponseEntity numberFormatException(HttpServletRequest req, NumberFormatException e) {
//e.printStackTrace();
logger.error("接收了一个数字格式的异常{}",e.getMessage());
return ResponseEntity.badRequest().body("好兄弟,数字转换异常!请检查传参的数据类型哈!");
}
/**
* 请求方法不支持异常
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
@ResponseBody
public ResponseEntity httpRequestMethodNotSupportedException(HttpServletRequest req, NumberFormatException e) {
//e.printStackTrace();
logger.error("请求方式错误的异常{}",e.getMessage());
return ResponseEntity.badRequest().body("好兄弟,请求方式不对哈!请检查请求方式!");
}
/**
* 类型转换异常处理
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = ClassCastException.class)
@ResponseBody
public ResponseEntity classCastException(HttpServletRequest req, NumberFormatException e) {
//e.printStackTrace();
logger.error("类型转换 异常{}",e.getMessage());
return ResponseEntity.badRequest().body("好兄弟,类型转换异常!请检查传参的数据类型哈!");
}
/**
* 死锁异常 不能确认锁异常:可能产生原因:A是大事务,然后指定了B业务,B业务也有个事务,A等B提交事务,B一直无法提交事务,这个事务 上述有执行一遍 就会造成死锁异常
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = CannotAcquireLockException.class)
@ResponseBody
public ResponseEntity cannotAcquireLockException(HttpServletRequest req, NumberFormatException e) {
//e.printStackTrace();
logger.error("死锁异常 {},为了避免锁表,请使用'select * from information_schema.INNODB_TRX' 如果锁表了,快速kill 某个trx_mysql_thread_id,以解除锁表",e.getMessage());
return ResponseEntity.badRequest().body("好兄弟,锁表异常!请检查管理员处理!");
}
/**
* 全部异常处理
*
* @param req
* @param e
* @return
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseEntity allException(HttpServletRequest req, Exception e) {
//e.printStackTrace();
logger.error("接收了一个未处理的异常{}",e.getMessage());
return ResponseEntity.badRequest().body("后台没有定义本次异常的处理,请联系后台是提供时间以便于检查日志,并补全此类型的异常处理!");
}
}
然后抓一个异常,就可以被拦截了。
特殊说明:
以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!