zoukankan      html  css  js  c++  java
  • SpringMVC 全局异常处理

    JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大。SpringMvc 对于异常处理这块提供了支持,通过 SpringMvc 提供的全局异常处理机制,能够将所有类型的异常处从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

    全局异常实现方式

    Spring MVC 处理异常有 3 种方式:
    1.使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver;
    2.实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异
    常处理器;
    3.使用@ExceptionHandler 注解实现异常处理;

    全局异常处理方式一
    配置 SimpleMappingExceptionResolver 对象

    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    
        <property name="defaultErrorView" value="error"></property>
    
        <property name="exceptionAttribute" value="ex"></property>
    
        <property name="exceptionMappings">
    
            <props>
    
                <prop key="com.shsxt.exception.BusinessException">error</prop>
    
                <prop key="com.shsxt.exception.ParamsException">error</prop>
    
            </props>
    
        </property>
    
    </bean>
    

      使用 SimpleMappingExceptionResolver 进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,但该方法仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的情况不适用。

    全局异常处理方式二

    实现 HandlerExceptionResolver 接口

    public class MyExceptionHandler implements HandlerExceptionResolver {
    
        @Override
    
        public ModelAndView resolveException(HttpServletRequest request,
    
                HttpServletResponse response, Object handler, Exception ex) {
    
            Map<String,Object> map=new HashMap<String, Object>();
    
            map.put("ex", ex);
    
            ModelAndView mv=null;
    
            if(ex instanceof ParamsException){
    
                return new ModelAndView("error_param", map);
    
            }
    
            if(ex instanceof BusinessException){
    
                return new ModelAndView("error_business", map);
    
            }
    
            return new ModelAndView("error", map);
    
        }
    
    }
    

      使用实现 HandlerExceptionResolver 接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。


    全局异常处理方式三
    页面处理器继承 BaseController

    public class BaseController {
    
        @ExceptionHandler
    
        public String exc(HttpServletRequest request,HttpServletResponse
    
                response,Exception ex){
    
            request.setAttribute("ex", ex);
    
            if(ex instanceof ParamsException){
    
                return "error_param";
    
            }
    
            if(ex instanceof BusinessException){
    
                return "error_business";
    
            }
    
            return "error";
    
        }}
    
     

     

    使用@ExceptionHandler 注解实现异常处理,具有集成简单、有扩展性好(只需要将要异常处理的 Controller 类继承于 BaseController 即可)、不需要附加Spring 配置等优点,但该方法对已有代码存在入侵性(需要修改已有代码,使相关类继承于 BaseController),在异常处理时不能获取除异常以外的数据。

    未捕获异常的处理

    对于 Unchecked Exception 而言,由于代码不强制捕获,往往被忽略,如果运行期产生了Unchecked Exception,而代码中又没有进行相应的捕获和处理,则我们可能不得不面对尴尬的 404 500……等服务器内部错误提示页面。我们需要一个全面而有效的异常处理机制。目前大多数服务器也都支持在 Web.xml 中通过<error-page>(Websphere/Weblogic)或者<error-code>(Tomcat)节点配置特定异常情况的显示页面。修改 web.xml 文件,增加以下内容:

     

     <!-- 出错页面定义 -->
    
    <error-page>
    
        <exception-type>java.lang.Throwable</exception-type>
    
        <location>/500.jsp</location>
    
    </error-page>
    
    <error-page>
    
        <error-code>500</error-code>
    
        <location>/500.jsp</location>
    
    </error-page>
    
    <error-page>
    
        <error-code>404</error-code>
    
        <location>/404.jsp</location>
    
    </error-page>
    

      更多有关java异常处理请参阅上海尚学堂《JAVA异常处理方式 try-catch-finally》、《Java异常解读以及通过业务逻辑解决异常的方式》,请多多关注。

     

  • 相关阅读:
    mac xcode 编辑 plist 文件 value列展示不全
    React Native 打包异常:Connect to maven.google.com failed: connect timed out(原创)
    React Native 打包异常:Android resource linking failed(原创)
    面向交易的日内高频量化交易平台笔记
    wpf 样式继承
    wpf staticresource 是不允许向前引用(forward reference)的
    C# 32位程序访问64位注册表
    wpf 可视化树的注意点
    关于64位操作系统使用C#访问注册表失败的问题
    关于 vs 2012 键盘无法输入的问题
  • 原文地址:https://www.cnblogs.com/shsxt/p/8137138.html
Copyright © 2011-2022 走看看