java exhandler_Spring MVC @ExceptionHandler 示例

在本教程中,我们向您展示了如何在Spring MVC框架中进行异常处理。 通常情况下,我们使用@ExceptionHandler来决定在出现某种异常时应该返回哪个“视图”。

这个@ExceptionHandler类自Spring 3.0起可用

1.项目结构

查看项目目录结构,一个标准的Maven项目。

bc7fdfc03a181785f939cc7c3cabcadc.gif

2. 自定义 Exception

自定义异常,包含自定义错误代码和错误描述。

CustomGenericException.javapackage com.mkyong.web.exception;

public class CustomGenericException extends RuntimeException {

private static final long serialVersionUID = 1L;

private String errCode;

private String errMsg;

public String getErrCode() {

return errCode;

}

public void setErrCode(String errCode) {

this.errCode = errCode;

}

public String getErrMsg() {

return errMsg;

}

public void setErrMsg(String errMsg) {

this.errMsg = errMsg;

}

public CustomGenericException(String errCode, String errMsg) {

this.errCode = errCode;

this.errMsg = errMsg;

}

}

3. Spring Controller

Spring控制器,请查看下面的执行流程:如果用户提供 a /error 请求,它将抛出“CustomGenericException”,并且handleCustomException()方法将被触发。

如果用户提供 a /io-error 请求,它将抛出“IOException”,handleAllException()方法将被触发。

MainController.javapackage com.mkyong.web.controller;

import java.io.IOException;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.servlet.ModelAndView;

import com.mkyong.web.exception.CustomGenericException;

@Controller

public class MainController {

@RequestMapping(value = "/{type:.+}", method = RequestMethod.GET)

public ModelAndView getPages(@PathVariable("type") String type)

throws Exception {

if ("error".equals(type)) {

// go handleCustomException

throw new CustomGenericException("E888", "This is custom message");

} else if ("io-error".equals(type)) {

// go handleAllException

throw new IOException();

} else {

return new ModelAndView("index").addObject("msg", type);

}

}

@ExceptionHandler(CustomGenericException.class)

public ModelAndView handleCustomException(CustomGenericException ex) {

ModelAndView model = new ModelAndView("error/generic_error");

model.addObject("errCode", ex.getErrCode());

model.addObject("errMsg", ex.getErrMsg());

return model;

}

@ExceptionHandler(Exception.class)

public ModelAndView handleAllException(Exception ex) {

ModelAndView model = new ModelAndView("error/generic_error");

model.addObject("errMsg", "this is Exception.class");

return model;

}

}

4. JSP 页面

pages/index.jsp

Spring MVC @ExceptionHandler Example

${msg}

pages/error/generic_error.jsp

${errCode} : System Errors

System Errors

${errMsg}

5. 测试

回顾以下3个测试用例:

1. http://localhost:8080/SpringMvcExample/anything

bc7fdfc03a181785f939cc7c3cabcadc.gif

2. http://localhost:8080/SpringMvcExample/error

bc7fdfc03a181785f939cc7c3cabcadc.gif

3. http://localhost:8080/SpringMvcExample/io-error

bc7fdfc03a181785f939cc7c3cabcadc.gif

6. @ControllerAdvice 示例

上面的@ExceptionHandler例子只适用于单个控制器,全局应用(所有控制器),用@ControllerAdvice注释一个类。

GlobalExceptionController.javapackage com.mkyong.web.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;

import org.springframework.web.bind.annotation.ExceptionHandler;

import org.springframework.web.servlet.ModelAndView;

import com.mkyong.web.exception.CustomGenericException;

@ControllerAdvice

public class GlobalExceptionController {

@ExceptionHandler(CustomGenericException.class)

public ModelAndView handleCustomException(CustomGenericException ex) {

ModelAndView model = new ModelAndView("error/generic_error");

model.addObject("errCode", ex.getErrCode());

model.addObject("errMsg", ex.getErrMsg());

return model;

}

@ExceptionHandler(Exception.class)

public ModelAndView handleAllException(Exception ex) {

ModelAndView model = new ModelAndView("error/generic_error");

model.addObject("errMsg", "this is Exception.class");

return model;

}

}

7. 下载源码

参考

译文地址:http://www.mkyong.com/spring-mvc/spring-mvc-exceptionhandler-example/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值