任何成熟的MVC框架都应该提供异常处理机制,当然可以在Controller的请求处理方法中手动使用try…catch块捕捉异常,当捕捉到特定异常时,返回特定逻辑视图名,但这种处理方式非常繁琐,需要在请求处理方法中书写大量catch块。最大的缺点还在于异常处理与代码耦合,一旦需要改变异常处理方式,必须修改大量代码。
示例:SimpleMappingExceptionResolver处理异常
视图中有3个超链接,分别测试没有异常处理、有异常处理、特定异常处理3种情况:
<!DOCTYPE HTML> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" > <head> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <meta content="text/html;charset=UTF-8"/> <title>test Exception</title> </head> <body> <h2>test Exception</h2> <a href="test1">抛出异常</a><br> <a href="test2">没有异常处理</a><br> <a href="test3">简单处理异常</a><br> </body> </html> @GetMapping("/test1") public String test1() throws Exception { //抛出异常 throw new Exception(); }
@GetMapping("/test2") public String test2() throws Exception { //模拟异常 int i = 5/0; return "hi"; }
@GetMapping("/test3") public String test3() throws Exception { try { int i = 5/0; return "hi"; } catch (Exception e) { throw new SQLException("查找数据失败"); } }
又遇到一个问题,书上给出的配置自定义错误页面的示例又特么不能用!!!
<!-- p:defaultErrorView="error"表示所有没有指定的异常,都跳转到异常处理页面error p:exceptionAttribute="ex"表示异常处理页面中访问的异常对象变量名是ex --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" p:defaultErrorView="error" p:exceptionAttribute="ex"> <!-- 异常映射 exceptionMappings表示映射的异常,接受参数时一个properties key是异常类名,value是处理异常的页面 --> <property name="exceptionMappings"> <props> <prop key="IOException">ioerror</prop> <prop key="SQLException">sqlerror</prop> </props> </property> </bean>
这才是可用版
<!-- 配置使用 SimpleMappingExceptionResolver 来映射异常 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 配置异常的属性值为ex,那么在错误页面中可以通过 ${ex} 来获取异常的信息 如果不配置这个属性,它的默认值为exception --> <property name="exceptionAttribute" value="ex"></property> <!-- 定义默认的异常处理页面,当该异常类型的注册时使用 --> <property name="defaultErrorView" value="error"></property> <property name="exceptionMappings"> <props> <!-- 映射sqlerror异常对应sqlerror.jsp这个页面 --> <prop key="SQLException">sqlerror</prop> </props> </property> </bean>