java错误处理

监听器,获取用户设备信息

package com.xingxue.Interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;

public class InterceptorA implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Enumeration<String> names = request.getHeaderNames();
        while(names.hasMoreElements()){
            String n=names.nextElement();
            String v=request.getHeader(n);
            System.out.println(n+"  "+v);
        }
        System.out.println("拦截前+++");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截后+++");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("最终+++");
    }
}

题解

异常处理

package com.xingxue.springmvc;

import com.xingxue.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/demo")
public class DemoController {

    @RequestMapping("/index")
    public String index(){
        return "demo";
    }

    @RequestMapping("/login")
    public String login2(){
        User u=new User();
        u=null;
        u.toString();
        return "login";
    }

    @ExceptionHandler(Exception.class)
    public String error(Exception e){
        System.out.println(e);
        return "error";
    }
}

在实际开发过程中,我们通常会把应用后端分为3层来开发,Controller(控制器) Service(服务层) Dao(数据访问层),这3层都可能会有异常的发生,通常的做法是把异常,由 DAO 抛到 Service 再抛到 Controller,最后再控制其中处理异常。这样可以把异常反馈給最顶层调用者处理。但是一个系统中有若干个Controller ,若干个方法,处理异常就变得十分难受了,Springmvc提供了一种全局异常处理机制,允许我们在一个类中集中处理异常,控制器不需理会异常。

实现异常处理方式一:

  @ExceptionHandler({IOException.class,NullPointerException.class } )
  public String  excpetionHandle(){
           return "error";
  }

注解中的异常类型可以给 单个 或 多个

这种处理方式,比较局限,只能处理当前 Controller中的异常

实现全局异常处理方式一:

①实现 HandlerExceptionResolver 接口

//确保 AppGolablException 实例加入IOC容器中  可以用xml配置和注解配置
@Component
public class AppGolablException  implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        //这里无论什么异常都到 error 页面去
        //当然这里可以根据实际的异常类型做 不同的响应
        ModelAndView mv = new ModelAndView("error");
        return mv;
    }
}

②抛出异常

    @RequestMapping("/ex")
    public  String  testex(){
           throw  new NullPointerException("hehe");
    }
    @RequestMapping("/ex2")
    public  String  textex2() throws  Exception{
           throw  new IOException("haha");
    }

这时请求 ex 和 ex2 方法都会跳转到 error页面

实现全局异常处理方式二: @ControllerAdvice + @ExceptionHandler

①编写异常处理代码

@ControllerAdvice
public class AppException {
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Object handleHttpMessageNotReadableException(Exception e) {
        System.out.println("------------");
        return   "50X";
     }
}

②控制器抛出异常

    @RequestMapping("/ex")
    public  String  testex(){
           throw  new NullPointerException("hehe");
    }
    @RequestMapping("/ex2")
    public  String  textex2() throws  Exception{
           throw  new IOException("haha");
    }

猜你喜欢

转载自blog.csdn.net/qq_36120342/article/details/82627105
今日推荐