异常处理@ExceptionHandler遇到的问题

使用@ExceptionHandler处理异常发现了两个问题

1.首先发现配置了@ExceptionHandler 处理业务异常或者原生的Exception异常时候

发现没有效果

代码如下 


@Controller

public class BaseExceptionHandler {
    private static final Logger LOGGER = LoggerFactory.getLogger(BaseExceptionHandler.class);

    /**
     * 处理 Exception类型的异常
     * @param req
     * @param res
     * @param e
     * @throws Exception
     */
    @ExceptionHandler(Exception.class)
    public void resolveException(HttpServletRequest req, HttpServletResponse res, Exception e) throws Exception {
        LOGGER.error(e.getMessage(), e);

        res.setContentType("application/json");
        BaseResponse result = new BaseResponse();
        result.setCodeAndMessage(ResponseCodeEnum.SYS_ERROR.getCode(),
                ResponseCodeEnum.SYS_ERROR.getMessage() + e.getMessage());
        WriterUtil.write(res, result);

    }

controller层代码 

这里应该抛出超时异常 

期待的效果

{
  "code": "999",
  "message": "系统异常null"
}

实际效果

{
  "timestamp": 1532075339890,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "com.fomoney.invoice.core.core.commons.exception.BizException",
  "message": "用户未授权",
  "path": "/testException"
}

没有走我们的统一异常处理

发现是因为上面两处代码一个用的注解是 @Controller 一个是@Restcontroller

统一改成@Restcontroller就可以

 

2 问题2 如果是捕获原生的异常 

@RequestMapping("/mvc29")
	@ResponseBody
	public WebAsyncTask<AuthorizationResponseEntity> mvc29() {
		Callable<AuthorizationResponseEntity> callable = new Callable<AuthorizationResponseEntity>() {
			@Override
			public AuthorizationResponseEntity call() throws Exception {
				Thread.sleep(6000);
				AuthorizationResponseEntity t = new AuthorizationResponseEntity();
				t.setCodeAndMessage("200", "test");
				return t;
			}
		};
		return new WebAsyncTask<AuthorizationResponseEntity>(4000, callable);
	}

  发现仍然没有效果

实际抛出的效果类似如下

{
  "timestamp": 1532075339890,
  "status": 500,
  "error": "Internal Server Error",
  "exception": "com.fomoney.invoice.core.core.commons.exception.BizException",
  "message": "用户未授权",
  "path": "/testException"
}

@ControllerAdvice 需要 加在

类的前面如下

@RestController
@ControllerAdvice
public class BaseExceptionHandler {
	private static final Logger LOGGER = LoggerFactory.getLogger(BaseExceptionHandler.class);

	/**
	 * 处理 Exception类型的异常
	 * 
	 * @param req
	 * @param res
	 * @param e
	 * @throws Exception
	 */
	@ExceptionHandler(Exception.class)
	public void resolveException(HttpServletRequest req, HttpServletResponse res, Exception e) throws Exception {
		LOGGER.error(e.getMessage(), e);

		res.setContentType("application/json");
		BaseResponse result = new BaseResponse();
		result.setCodeAndMessage(ResponseCodeEnum.SYS_ERROR.getCode(),
				ResponseCodeEnum.SYS_ERROR.getMessage() + e.getMessage());
		WriterUtil.write(res, result);

	}

如上所示 即可 捕获

我们可以在BaseExceptionHandler中专门处理某个异常类 比如超时的

然后统一返回该类型超时的一些策略 ,因为该种超时可能和其他的超时返回值不一样

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!关于您提到的ExceptionHandler不生效的问题,我可以给您一些可能的解决方案。首先,请确保以下几点: 1. 异常处理器是否正确设置:请检查您的代码中是否正确设置了异常处理器。在Java中,可以使用try-catch语句块来捕获和处理异常。确保您已经正确地编写了try-catch块,并将处理逻辑放在catch块中。 2. 检查异常类型:确认捕获的异常类型与您预期的一致。Java中的异常是按照继承关系进行分类的,如果您在catch块中指定了一个不正确的异常类型,那么异常处理器就不会生效。可以尝试将catch块的异常类型更改为更通用的类型如Exception,这将捕获所有异常类型。 3. 确保异常被抛出:如果没有异常被抛出,那么异常处理器就不会执行。请确保在适当的地方使用throw语句来抛出异常。通常在方法内部遇到错误或不可预料的情况时才会抛出异常。 4. 检查异常处理顺序:如果多个catch块被使用,确保它们的顺序是正确的。Java会按照catch块的顺序进行匹配,并执行第一个匹配到的catch块中的代码。如果catch块的顺序不正确,那么异常处理器可能不会执行。 5. 检查异常处理器的范围:确保异常处理器的范围覆盖到可能抛出异常的代码区域。如果异常处理器的范围不正确,那么它将无法捕获到异常。 如果您已经检查了以上几点,但问题仍然存在,我建议您提供更多的上下文和代码示例,这样我可以更好地帮助您解决问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值