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

結語

有錯誤的地方麻煩評論指正一下哈,共勉。繼承

相關文章
相關標籤/搜索