springmvc异常处理

1.全局异常

1.1使用SimpleMappingExceptionResolver

这种方式是处理全局异常,只要有对应的异常抛出,就会使用这个bean进行处理。使用SimpleMappingExceptionResolver的话,只要在springmvc配置文件中作以下声明就能够了。web

<bean
        class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <-- 默认的异常界面,若是不是特殊指定的异常,都显示这个界面 -->
        <property name="defaultErrorView" value="/exception/handle/errorGlobal" />
        <-- 异常的名称,界面上能够使用这个来输出异常信息 -->
        <property name="exceptionAttribute" value="e" />
        <-- 指定特殊异常,并为特殊异常指定特定的界面 -->
        <property name="exceptionMappings">
            <props>
                <prop
                    key="xyz.zeling.exception.handle.modules.exception.handle.UserNotFoundException">/exception/handling/errorUser</prop>
            </props>
        </property>
    </bean>

1.2继承于HandlerExceptionResolver

这个是全局异常,只要有对应的异常抛出,就会使用这个类进行处理。注意使用这种方式的话,须要使这个类成为bean,能够使用注解方式,也能够在spring配置文件中声明。这个例子使用的是注解的方式。spring

@Component
public class GlobalExceptionHandlerAnother implements HandlerExceptionResolver {

    /**
     * 异常处理方法,ex就是程序抛出的异常
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
        Exception ex) {
        return new ModelAndView("/exception/handle/errorGlobal");
    }
}

1.3使用@ControllerAdvice

这个也是全局异常,只要有对应的异常抛出,就会使用@ExceptionHandler注解的方法进行处理,@ControllerAdvice注解的类除了有处理异常的@ExceptionHandler方法外,还有其它两个注解方法,感兴趣的同窗能够自行研究。mvc

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception e) {
        System.out.println("打印异常信息:");
        e.printStackTrace();
        return new ModelAndView("/exception/handling/errorGlobal");
    }
}

2.局部处理异常

2.1使用@ResponseStatus注解自定义异常

@ResponseStatus能够自定义返回状态码和提示信息。
使用方式,先自定义一个异常,并使用@ResponseStatus注解app

@ResponseStatus(
    value = HttpStatus.BAD_REQUEST,
    reason = "测试自定义返回码")
public class UserNotFoundException extends Exception {
    private static final long serialVersionUID = -8695002135215307249L;

    public UserNotFoundException(String name) {
        super("User not found with name: " + name);
    }
}

而后在你想抛出这个异常的地方进行抛出ide

if (user == null) {
            throw new UserNotFoundException(name);
        }

程序运行到这里以后,界面上就会返回一个自定义状态码和自定义提示信息。
PS:这个处理异常的方式会被@ControllerAdvice处理方式覆盖掉,其它的全局处理异常会不会覆盖没测试过,若是有测过的同窗麻烦帮忙评论告知。测试

2.2 Controller层里面使用@ExceptionHandler注解

这种方式处理的异常只针对于使用的那个Controller方法,使用方式:code

@Controller
@RequestMapping("/exception/handling")
public class ExceptionHandleController {

    @RequestMapping("/main")
    public ModelAndView toMain() {
        return new ModelAndView("/exception/handling/main");
    }
    
    /**
     * @description TODO
     * @date 2018年1月29日 下午11:50:58
     * @param e 注解使用的异常,能够看成参数
     * @return
     * @throws Exception
     */
    @ExceptionHandler(UserNotFoundException.class)
    public ModelAndView handleException(UserNotFoundException e) {
        // 异常处理逻辑
        // ...
        return new ModelAndView("/exception/handling/errorUser");
    }
}

结语

有错误的地方麻烦评论指正一下哈,共勉。继承

相关文章
相关标签/搜索