springmvc异常处理

qingjiuquan 2019-06-26

1.全局异常

1.1使用SimpleMappingExceptionResolver

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

<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配置文件中声明。这个例子使用的是注解的方式。

@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方法外,还有其它两个注解方法,感兴趣的同学可以自行研究。

@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注解

@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);
    }
}

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

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

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

2.2 Controller层里面使用@ExceptionHandler注解

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

@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");
    }
}

结语

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

相关推荐