SpringMVC框架异常处理

1@ExceptionHandler 注解

@ExceptionHandler 可以将一个方法指定为异常处理方法。
被注解的方法,其返回值可以是 ModelAndView、String,或 void,方法名随意,方法参数可以是
Exception 及其子类对象、HttpServletRequest、HttpServletResponse 等。系统会自动为这些方法参数赋值。

对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中.

2. 实现步骤

1.自定义异常类

自定义的用来处理team表操作的异常类

package com.kkb.exceptions;

public class teamException extends Exception {
    public teamException() {
    }

    public teamException(String message) {
        super(message);
    }
}

 下面是两个异常子类 ,分别id大小异常和name格式异常

package com.kkb.exceptions;

public class idException extends teamException {
    public idException() {
    }

    public idException(String message) {
        super(message);
    }
}
package com.kkb.exceptions;

public class nameException  extends teamException{
    public nameException() {
    }

    public nameException(String message) {
        super(message);
    }
}

2.编写控制器 controller

package com.kkb.controller;
import com.kkb.exceptions.TeamException;
import com.kkb.exceptions.TeamIdException;
import com.kkb.exceptions.TeamNameException;
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.servlet.ModelAndView;

@Controller
@RequestMapping("ex")
public class ExController {
 @RequestMapping("test01/{id}/{name}")
 public ModelAndView test01(@PathVariable("id") Integer
 teamId,@PathVariable("name") String teamName) throws TeamIdException,
      TeamNameException{
    ModelAndView mv=new ModelAndView();
    if(teamId<=1000){
    throw new TeamIdException("teamId不合法!必须在1000之上!");
     }
    if("test".equals(teamName)){
    throw new TeamNameException("teamName不合法!不能使用test!");
    }
    System.out.println(10/0);
    mv.setViewName("ok");
    return mv;
 }
@ExceptionHandler(value =
{TeamIdException.class,TeamNameException.class,Exception.class})
  public ModelAndView exHandler(Exception ex){
   ModelAndView mv=new ModelAndView();
   mv.addObject("msg",ex.getMessage());
   if(ex instanceof TeamIdException)
     mv.setViewName("idError");
   else if(ex instanceof TeamNameException)
     mv.setViewName("nameError");
   else
      mv.setViewName("error");
 return mv;
   }
}

3.编写error.jsp、idError.jsp、nameError.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>error</title>
</head>
<body>
<h1>默认的错误页面--${msg}</h1>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>id error</title>
</head>
<body>
<h1>teamId Error----${msg}</h1>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>name error</title>
</head>
<body>
<h1>teamName error---${msg}</h1>
</body>
</html>

优化


一般将异常处理方法专门定义在一个类中,作为全局的异常处理类。
使用注解@ControllerAdvice,就是“控制器增强”,是给控制器对象增强功能的。使用
@ControllerAdvice 修饰的类中可以使用@ExceptionHandler。
当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的类中的异常处理方法。
@ControllerAdvice 注解所在的类需要进行包扫描,否则无法创建对象。

<context:component-scan base-package="com.kkb.exceptions"/>

定义全局异常处理类:

package com.kkb.exceptions;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = TeamIdException.class)
    public ModelAndView exHandler1(Exception ex){
    ModelAndView mv=new ModelAndView();
    mv.addObject("msg",ex.getMessage());
    mv.setViewName("idError");
    return mv;
}
@ExceptionHandler(value = TeamNameException.class)
public ModelAndView exHandler2(Exception ex){
    ModelAndView mv=new ModelAndView();
    mv.addObject("msg",ex.getMessage());
    mv.setViewName("nameError");
    return mv;
}

@ExceptionHandler(value = Exception.class)
public ModelAndView exHandler3(Exception ex){
    ModelAndView mv=new ModelAndView();
    mv.addObject("msg",ex.getMessage());
    mv.setViewName("error");
    return mv;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值