“拦截器异常怎么处理”这个问题比较通用,我先给你一个通用思路,再结合**常见框架(Spring、Vue/React、Axios)**给出具体做法。你可以对照使用。
拦截器本身不要吞掉异常
区分异常类型
统一返回结构
{
"code": 500,
"message": "系统异常",
"data": null
}
记录日志
兜底处理
❌ 不推荐:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
try {
check();
} catch (Exception e) {
return false;
}
return true;
}
✅ 推荐:抛异常 + 全局异常处理
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (!check()) {
throw new AuthException("未登录");
}
return true;
}
@ControllerAdvice 统一处理@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(AuthException.class)
public Result<Void> handleAuth(AuthException e) {
return Result.fail(401, e.getMessage());
}
@ExceptionHandler(Exception.class)
public Result<Void> handleAll(Exception e) {
log.error("系统异常", e);
return Result.fail(500, "系统异常");
}
}
| 组件 | 异常能否被 @ControllerAdvice 捕获 |
|---|---|
| Filter | ❌ 不能 |
| Interceptor | ✅ 可以 |
| Controller | ✅ 可以 |
✅ 拦截器异常 = 正常走 Spring 异常处理流程
axios.interceptors.request.use(
config => {
// 可能抛异常
config.headers.Authorization = getToken()
return config
},
error => {
// 请求拦截器异常
return Promise.reject(error)
}
)
⚠️ 不要吞掉异常
axios.interceptors.response.use(
response => response,
error => {
if (!error.response) {
// 网络异常
console.error('网络异常', error)
return Promise.reject(new Error('网络异常'))
}
const { status, data } = error.response
if (status === 401) {
// 跳登录
router.push('/login')
}
return Promise.reject(data?.message || '未知错误')
}
)
✅ 统一错误提示
✅ 避免重复弹窗
✅ 区分:
❌ 拦截器里 return false 但不返回错误
❌ 拦截器吞掉异常
❌ 前端没处理 error.response 为 undefined 的情况
❌ 拦截器里写大量业务逻辑
✅ 推荐:
你可以补充:
我可以直接给你可复制的示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。