2024.10月12日--- SpringMVC异常处理

异常处理

SpringMVC处理异常的方式有三种,当然也可以使用AOP面向编程,自定义一个类进入切入。

第一种:使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver

<!--SpringMVC提供的异常处理器类型:SimpleMappingExceptionResolver-->

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<!-- 异常映射属性: 是一个map散列表 用于配置不同异常跳转到不同页面 -->

<property name="exceptionMappings">

<props>

<!--key: 用于指定异常类型, value用于指定跳转的页面名称-->

<prop key="java.lang.Exception">error</prop>

</props>

</property>

</bean>

第二种:实现HandlerExceptionResolver接口,自定义异常处理器,并注册

/**

* 用户【】 IP[]

* 在【时间】

* 操作【Controller.find】 发生如下异常

* xxxxxxxxxxxxxxxxxxxxx

* yyyyyyyyyyyyyyyyyyyyy

*

*/

package com.ssm.netctoss.util;

import org.springframework.http.HttpStatus;

import org.springframework.web.servlet.HandlerExceptionResolver;

import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class MyExceptionResolver implements HandlerExceptionResolver {

@Override

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {

ModelAndView modelAndView = new ModelAndView();

System.out.println("---------执行了自定义异常处理器------------");

// 根据不同的异常类型,设置不同的响应状态码

if (e instanceof MyCustomException) {

response.setStatus(HttpStatus.BAD_REQUEST.value());

// 可以添加更多的自定义处理逻辑

System.out.println("-----");

}else if (e instanceof IllegalArgumentException) {

//

}else {

response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());

// 记录日志或其他处理逻辑

}

// 可以将异常信息放入模型中供视图展示

modelAndView.addObject("errorMessage", e.getMessage());

// 设置视图名称

modelAndView.setViewName("error");

return modelAndView;

}

}

class MyCustomException extends Exception {

public MyCustomException(String message) {

super(message);

}

}

xml配置文件添加:

<bean class="com.ssm.netctoss.util.MyExceptionResolver"/>

第三种:使用@ExceptionHandler注解实现异常处理

  1. 编写如下方法

  2. 在方法上添加注解

  3. 其他Controller继承即可

package com.ssm.netctoss.util;

import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;

public class BaseController {

@ExceptionHandler

public String executeEx(HttpServletRequest request,Exception e){

// request.setAttribute("msg", e.getMessage());

// request.setAttribute("code", 1);

System.out.println("---------------注解异常");

//根据不同异常类型,返回不同视图

return "error";

}

}

第四种:使用AOP,自定义异常处理类型

可以正常统一处理异常信息 并且 开启注解扫描,别忘记了

package com.ssm.netctoss;

import java.text.SimpleDateFormat;

import java.util.Date;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import com.ssm.netctoss.pojo.Admin;

import org.apache.log4j.Logger;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;

/**

* 用户【】 IP[]

* 在【时间】

* 操作【Controller.find】 发生如下异常

* xxxxxxxxxxxxxxxxxxxxx

* yyyyyyyyyyyyyyyyyyyyy

*

*/

@Component

@Aspect

public class ExceptionLogger {

@Resource

private HttpServletRequest request;

@Around("within(com.ssm.netctoss.controller..*)")

public Object log(ProceedingJoinPoint p) throws Exception{

Object obj = null;

try {

obj = p.proceed();

} catch (Throwable e) {

// 记录异常信息

Admin admin = (Admin)request.getSession().getAttribute("LOGINADMIN");

String msg="";

if(admin!=null){

String adminCode = admin.getAdminCode();

String ip = request.getRemoteHost();

String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

String className = p.getTarget().getClass().getName();

String methodName = p.getSignature().getName();

msg+="用户["+adminCode+"],IP["+ip+"],在"+now+"],操作["+className+"."+methodName+"]时,发生如下异常:\n";

}

StackTraceElement[] elems = e.getStackTrace();

for(StackTraceElement elem:elems){

msg+="\t"+elem.toString()+"\n";

}

Logger logger = Logger.getLogger(ExceptionLogger.class);

logger.error(msg);

//记录日志后,抛出异常,交给后面的代码继续处理

throw new Exception(e);

}

return obj;

}

}

相关推荐
aischang3 分钟前
统信桌面专业版如何使用python开发平台jupyter
开发语言·python·jupyter·统信uos
会飞的哈士奇5 分钟前
Html实现图片上传/裁剪/马赛克/压缩/旋转/缩放
java·spring·html
摘星编程19 分钟前
原型模式深度解析:Java设计模式实战指南与克隆机制优化实践
java·设计模式·性能优化·原型模式·创建型模式·软件架构·对象克隆
狐凄25 分钟前
Python实例题:Python计算概率论
开发语言·python·概率论
liujing1023292926 分钟前
Day09_刷题niuke20250609
java·c++·算法
无奈何杨27 分钟前
事件时间驱动的策略版本管理:风控系统中的关键设计抉择
java·后端·架构
程序员JerrySUN1 小时前
Linux 内核内存管理子系统全面解析与体系构建
java·linux·运维
q567315231 小时前
分布式增量爬虫实现方案
开发语言·分布式·爬虫·python
勤奋的知更鸟1 小时前
LLaMA-Factory和python版本的兼容性问题解决
开发语言·python·llama-factory
CIb0la1 小时前
Ai自动补全编程工具:llama vscode
运维·开发语言·学习·测试工具·程序人生