SpringMVC异常处理

任何成熟的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>