spring项目中,要统一处理异常,ExceptionHandler是必须实现的,但是@ExceptionHandler是不能拦截HandlerInterceptorAdapter.preHandle()方法抛出的异常的,根本原因还要看执行顺序:Filter->Interceptor->ControllerAdvice->Aspect,preHandle不会受ControllerAdvice影响。
所以Filter我们可以可以通过跳转的方式特殊处理:
request.getRequestDispatcher("/exception/401").forward(request,response);
同时需要实现ExceptionController
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.publisher.common.vo.Res;
import com.publisher.common.vo.ResultCode;
import com.publisher.exception.ServiceException;
//@Controller
@RestController
@RequestMapping("/exception")
public class ExceptionController {
@Value("${publisher.privateKey}")
private String privateKey;
@RequestMapping("/401")
@ResponseBody
public Res handle() {
throw new ServiceException(ResultCode.UNAUTHORIZED);
}
}
HandlerInterceptorAdapter完整代码:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import com.publisher.utils.JwtUtils;
import com.publisher.utils.SessionUtils;
import io.jsonwebtoken.Claims;
@Component
public class LoginFilter extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String path = request.getServletPath();
if(StringUtils.equals("/v1/getToken", path)||StringUtils.equals("/index.html", path)){//白名单
return true;
}
String token = request.getHeader("token");
if(StringUtils.isBlank(token)){
// throw new ServiceException(ResultCode.UNAUTHORIZED);
request.getRequestDispatcher("/exception/401").forward(request,response);
return false;
}
try{
Claims aa = JwtUtils.checkJWT(token);
SessionUtils.setMember(aa);
}catch(Exception e){
request.getRequestDispatcher("/exception/401").forward(request,response);
return false;
// throw new ServiceException(ResultCode.UNAUTHORIZED);
}
return true;
}
}
ExceptionHandler 异常统一统一处理类
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import com.publisher.common.vo.Res;
import com.publisher.common.vo.ResultCode;
import com.publisher.exception.ServiceException;
import java.util.regex.Pattern;
@ControllerAdvice
public class ExceptionHandler {
Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
@org.springframework.web.bind.annotation.ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Res handle(MethodArgumentNotValidException e) {
String message = ResultCode.FAILED.getMsg();
if (e.getBindingResult().getAllErrors().size() > 0) {
message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
}
// Matcher matcher = p.matcher(message);
// if (!matcher.find()) {
// e.printStackTrace();
// }
return Res.failed(message);
}
@org.springframework.web.bind.annotation.ExceptionHandler(value = {IllegalArgumentException.class})
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Res handle(IllegalArgumentException ex) {
String message = ex.getMessage();
// Matcher matcher = p.matcher(message);
// if (!matcher.find()) {
ex.printStackTrace();
// }
return Res.failed(message);
}
@org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Res handle(Exception e) {
String message = e.getMessage();
// Matcher matcher = p.matcher(message);
// if (!matcher.find()) {
e.printStackTrace();
// }
return Res.failed(message);
}
//ServiceException业务异常,可预知业务错误,不输出异常堆栈,比如说授权失败。
@org.springframework.web.bind.annotation.ExceptionHandler(ServiceException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public Res handle(ServiceException e) {
return Res.failed(e.getResultCode());
}
分享到:
相关推荐
`ExceptionHandler`是一个专门用于捕获和处理iOS应用中的异常的机制。这个机制允许我们优雅地处理程序运行时可能出现的错误,避免应用崩溃,并提供详细的信息以便于定位问题。 首先,让我们了解一下iOS中的异常模型...
`ExceptionHandler`通常是指一个系统或第三方库,用于捕获并处理程序中的异常,确保应用的稳定性和用户体验。本文将详细介绍iOS中的异常处理机制以及如何使用`ExceptionHandler`进行异常管理和日志记录。 ### iOS ...
**WCF_ExceptionHandler** Windows Communication Foundation (WCF) 是微软.NET框架中的一种技术,用于构建分布式应用程序,它提供了丰富的服务模型来实现不同系统间的通信。`WCF_ExceptionHandler`是针对WCF服务的...
customExceptionHandler(new ErrorException($error['message'], $error['type'], 0, $error['file'], $error['line'])); } } ``` 5. **最佳实践** - 在生产环境中,应确保异常处理器不会泄露敏感信息,例如源...
"ExceptionHandler.zip"这个压缩包就提供了一个全面的minidump示例,涵盖了各种测试用例,适用于win32和win64平台,对于C/C++开发者来说,这是一个宝贵的资源。 首先,让我们来理解什么是minidump。Minidump是...
Android 测试捕获全局异常消息ExceptionHandler用法,我自己测试抛出一个异常,thread为未捕获异常的线程, e为未捕获的异常,收集当前的手机信息,捕获手机当前的异常信息,然后写入异常信息到文件中,最后使用 ...
本篇文章将深入探讨Laravel的异常处理机制,以及如何自定义`ExceptionHandler`来满足项目需求。 首先,Laravel的异常处理主要由`\App\Exceptions\Handler`类负责,这个类在`app/Exceptions`目录下。`Handler`类继承...
例如,你可能需要在你的主程序中创建一个`ExceptionHandler`对象,它负责监听异常并生成崩溃转储: ```cpp #include "google_breakpad/client/windows/handler/exception_handler.h" std::wstring dump_path; // ...
在Laravel框架中,异常处理是系统运行过程中不可或缺的一部分。异常是程序运行时遇到的错误或不正常情况,而异常处理则确保这些错误能够被优雅地捕获、记录和响应,从而保持应用的稳定性和用户体验。...
《ExceptionHandler开源库解析》 ExceptionHandler是一款专为Windows平台设计的开源异常处理库,它主要针对的是那些希望在软件发布后能够捕获并分析程序崩溃情况的开发者。通过集成这个库,开发者可以设置程序在...
总的来说,遇到Disruptor的`FatalExceptionHandler`错误时,应从多个角度进行排查,结合具体的异常信息分析原因,并采取相应的措施进行修复和优化,以确保系统的稳定运行。同时,良好的编程习惯和全面的测试策略是...
5. **异常处理**:Spring MVC通过`@ExceptionHandler`注解处理异常,可以返回定制的错误页面。配合jQuery,可以在前端优雅地处理错误,如弹出错误消息。 6. **RESTful API**:Spring MVC支持构建RESTful服务,与...
spring_exceptionHandler Spring boot/Spring 统一错误处理方案的使用
logItDown是一个AngularJS模块,它将您所有的$log和$exceptionHandler消息收集到一个服务中以供以后检查。 这为您提供了一个类似于日志的后端,您可以在其中查看异常之前发生的情况。 安装 通过下载源代码。 ...
通过实现`HandlerInterceptor`接口或者继承`HandlerInterceptorAdapter`抽象类,开发者可以定义自己的拦截器。拦截器通常用于实现如登录检查、权限验证、日志记录、性能统计等跨切面的功能。 1. 拦截器的注册:拦截...
CustomExceptionHandler customExceptionHandler = new CustomExceptionHandler(currentUEH); Thread.setDefaultUncaughtExceptionHandler(customExceptionHandler); } } ``` 除了处理主线程的异常,我们还需要...
6. **ExceptionHandler(错误消息统一处理)**:在SpringBoot应用中,通过全局异常处理器(@ControllerAdvice + @ExceptionHandler)可以统一处理所有控制器层的异常,提供友好的错误提示,同时便于日志记录和问题...
CustomExceptionHandler exceptionHandler = new CustomExceptionHandler(this); Thread.setDefaultUncaughtExceptionHandler(exceptionHandler); } } ``` 现在,当应用中的任何线程抛出未捕获的异常时,`...
首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的协程客户端,常驻内存,不依赖传统的 PHP-FPM,全异步非阻塞 IO 实现,以类似于同步客户端的写法实现异步客户端的使用...
在实际开发中,还可以结合Android的`Crashlytics`或`Fabric`等第三方服务,它们提供了更完善的异常捕获和分析功能,可以自动收集错误报告并提供详细的崩溃分析。 总的来说,通过自定义`Thread....