转载

Springmvc处理异常

  • 异常的体系结构:
Throwable
		Error
			OutOfMemoryError(OOM)
		Exception
			RuntimeException
				NullPointerException:某个为null的对象调用了属性或方法
				ClassCastException:强制转换为不匹配的数据类型
				ClassNotFoundException:尝试加载的类不存在
				IndexOutOfBoundsException:使用List集合时使用了越界的索引
					ArrayIndexOutOfBoundsException:使用Array时使用了越界的索引
			SQLException:数据库相关异常
			IOException:输入输出(读写)异常
				FileNotFoundException:文件找不到

在Spring MVC中处理异常

  • 在Spring MVC中,提供了一种统一处理某种异常的机制,例如通过配置,可以对整个项目中的 NullPointerException 进行处理,那么,无论是项目的哪个环节出现该异常,都会自动按照配置的方式进行处理,而不用每个方法中逐一编写相关代码。

准备演示案例

  • 创建项目 DAY07-SpringMVC-Exception ,设计请求路径:

    http://SERVER:PORT/PROJECT/ex1.do

    http://SERVER:PORT/PROJECT/ex2.do

  • 以上3个请求将分别由 ex1.jspex2.jsp 页面显示。

使用SimpleMappingExceptionResolver

  • 在Spring MVC中,有 SimpleMappingExceptionResolver 类,用于配置 异常与View组件 的映射关系,如果确定某种异常出现后都会显示某个View组件,则在Spring的配置文件中:
<beanclass="xx.xx.SimpleMappingExceptionResolver">
	<propertyname="exceptionMappings">
		<props>
			<propkey="异常类的全名">View组件名</prop>
			<propkey="异常类的全名">View组件名</prop>
			<propkey="异常类的全名">View组件名</prop>
		<props>
	</property>
</bean>
  • 经过以上配置后,整个项目运行到任何位置,一旦出现以上配置过的异常,都会转发到匹配的View组件,在项目的各个方法中,不必再处理已经配置过的异常!

  • 这种做法的不足在于:只要是同一种异常,都是转发到同一个View组件,无法根据实际运行状态进行更加细化的处理,例如无法提示是哪个值错误或者某些原因导致的异常。

使用@ExceptionHandler

注意:使用SimpleMappingExceptionResolver处理异常时,不可以使用@ExceptionHandler!

  • 当需要统一处理异常时,可以在控制器类中自定义方法(方法名称自定义),并在方法上方添加 @ExceptionHandler ,与处理请求的方法类似,可以按需添加方法的参数,需要注意的,必须有 Exception 参数:
@ExceptionHandler
public String handleException(
	HttpServletRequest request,
	Exception ex) {
	System.out.println(ex.getClass());
	
	if (ex instanceof NullPointerException) {
		return "error1";
	} else if (ex instanceof ArrayIndexOutOfBoundsException) {
		return "error2";
	} else {
		return "error3";
	}
}
  • 这种做法,是作用于当前控制器类内部的所有请求的处理!对其它控制器类中的异常是没有影响的!
原文  https://chenjiabing666.github.io/2018/05/04/Springmvc处理异常/
正文到此结束
Loading...