【SpringMVC】业务处理与异常处理的解耦——异常处理器

异常处理的思路

在学习框架之前,我们是如何处理异常的呢?try-catch

这样做有两个缺点:其一是try模块之中写的往往是业务逻辑代码,业务处理与异常处理耦合在了一起;其二是catch模块之中写的往往是打印异常信息,用户看到这些信息体验极差。

而SpringMVC框架巧妙对其进行了解耦:

Dao层、Service层、Controller层中出现了异常,我们毫不犹豫地一层一层向上抛,最终异常被抛到前端控制器(DispatcherServlet),其调用异常处理器(ExceptionResolver)进行统一的处理。

 
 

异常处理的两种实现

① 使用SpringMVC框架提供的简单异常处理器SimpleMappingExceptionResolver

② 使用自己手写的自定义异常处理器并实现HandlerExceptionResolver接口

 
 

简单映射异常处理器(框架提供)

对于每一种异常,对应跳转到一种错误视图。一切都是为了让用户看到的页面更友好。

<!-- 配置简单映射异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <!-- 默认错误页面 -->
    <property name="defaultErrorView" value="error_0.jsp" />
    <!-- 各种异常及其对应错误视图 -->
    <property name="exceptionMappings">
        <map>
            <entry key="java.lang.NullPointerException" value="error_1.jsp" />
            <entry key="java.lang.RuntimeException" value="error_2.jsp" />
            <entry key="java.io.IOException" value="error_3.jsp" />
            <entry key="java.io.FileNotFoundException" value="error_4.jsp" />
            <entry key="java.sql.SQLException" value="error_5.jsp" />
            <!-- More kinds of Exceptions... -->
        </map>
    </property>
</bean>

 
 

自定义映射异常处理器(自己手写)

对于每一种异常,不仅可以对应跳转到一种错误视图,还能附加上一些信息。

手写实现HandlerExceptionResolver接口的异常处理器:

public class MyExceptionResolver implements HandlerExceptionResolver {
    
    

    // 关键参数:异常对象Exception
    // 返回值:跳转的错误视图信息ModelAndView
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
    
    

        ModelAndView modelAndView = new ModelAndView();

        if(e instanceof java.lang.NullPointerException) {
    
    
            modelAndView.addObject("xxx", "xxxxxxx");
            modelAndView.setViewName("error_1.jsp");
        } else if(e instanceof java.lang.RuntimeException) {
    
    
            modelAndView.addObject("xxx", "xxxxxxx");
            modelAndView.setViewName("error_2.jsp");
        } else if(e instanceof java.io.IOException) {
    
    
            modelAndView.addObject("xxx", "xxxxxxx");
            modelAndView.setViewName("error_3.jsp");
        } else if(e instanceof java.io.FileNotFoundException) {
    
    
            modelAndView.addObject("xxx", "xxxxxxx");
            modelAndView.setViewName("error_4.jsp");
        } else if(e instanceof java.sql.SQLException) {
    
    
            modelAndView.addObject("xxx", "xxxxxxx");
            modelAndView.setViewName("error_5.jsp");
        } else {
    
    
        	modelAndView.addObject("xxx", "xxxxxxx");
            modelAndView.setViewName("error_0.jsp");
        }

        return modelAndView;
    }
}

然后告诉框架一声:

<!-- 配置自定义异常处理器 -->
<bean class="com.samarua.resolver.MyExceptionResolver" />

 
 
 
 

 
 
 
 

 
 
 
 

More >_<

猜你喜欢

转载自blog.csdn.net/m0_46202073/article/details/114394446