(十一)博客后端环境搭建——异常处理

2021年3月26日 7点热度 0条评论 来源: weixin_48102099

1、在项目过程中会出现很多的错误,所以要进行异常处理,
在进行异常处理时首先进行异常页面的创建

根据可能出现的异常情况可分为以下三种:
404
1、404页面(指文件路径找不到了,spring boot会自动跳转到404页面)
2、500页面(后台出错,500同上)
3、error(自定义的错误页面,需要建立拦截器)

2、测试页面时需要定义一个Web控制器

步骤;:
1.在com.lrm目录下建一个web包
2、新建一个controller类
3、在类中加上“@Controller”注解


@Controller
public class indexController { 
// 通过get方式根据根路径返回index页面
    @GetMapping("/")
    public String index(){ 
// int i=9/0;
        return "index";
    }
}

5,自定义error页面拦截器建立步骤

1,在com.lrm目录下建立一个hander包
2.在包下建立一个controllerExceptionHander的类
3.加注解“ @ControllerAdvice”

详细 代码

package com.lrm.blog.hander;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;

@ControllerAdvice
public class controllerExceptionHander { 

    public final Logger logger = LoggerFactory.getLogger(this.getClass());

    @ExceptionHandler(Exception.class)
    public ModelAndView exceptionHander(HttpServletRequest request, Exception e){ 
        logger.error("Requst RUL :{},Exception :{}",request.getRequestURI(), e);

        ModelAndView mv = new ModelAndView();
        Object attributeName;
        mv.addObject("url",request.getRequestURI());
        mv.addObject("exception",e);
        mv.setViewName("error/error");
        return mv;
    }
}

此时在测试类controllerExceptionHander类中人为改错信息

package com.lrm.blog.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController { 
// 通过get方式根据根路径返回index页面
    @GetMapping("/")
    public String index(){ 
// 人为设错误信息,0不可能做分母
        int i=9/0;
        return "index";
    }
}

重新启动spring boot后访问127.0.0.0.1:8080就会跳转到自定义的错误页面

为了能够很方便的在客户端的网页查看日志(错误提示)而不去服务器查看
这地方需要在自定义的“error”页面设置“显示在客户端的代码”

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>错误</title>
</head>
<body>
<h1>错误</h1>
<div >
    <div th:utext="'&lt;!--'" th:remove="tag"></div>
    <div th:utext="'Failed Request URL : ' +${url}" th:remove="tag"></div>
    <div th:utext="'Exception message : ' +${exception.message}" th:remove="tag"></div>
    <ul th:remove="tag">
        <li th:each="st : ${exception.stackTrace}" th:remove="tag"><span th:utext="${st}" th:remove="tag"></span></li>
    </ul>
    <div th:utext="'--&gt;'" th;remove="tag"></div>
</div>
</body>
</html>

此时在重新启动spring boot访问8080端口时可以查看网页源代码

6,由于自定义的error异常拦截器会把所有的错误异常通过error展示,这时如果对“找不到页面”的错误进行单独展示的话,需要对新建一个NotFoundException类同时对controllerExceptionHander拦截器进行“不作用于”NotFoundException的设置

步骤:
1.人为设置博客找不到

package com.lrm.blog.web;

import com.lrm.blog.NotFoundException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class indexController { 
// 通过get方式根据根路径返回index页面
    @GetMapping("/")
    public String index(){ 
        String blog = null;
        if(blog==null){ 
        //抛出NotFoundException异常
            throw new NotFoundException("博客不存在");
        }
        return "index";
    }
}

2.建立 NotFoundException类

package com.lrm.blog;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
//@ResponseStatus(HttpStatus.NOT_FOUND)为改变状态的注解
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException  extends RuntimeException{ 
    public NotFoundException() { 
    }

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

    public NotFoundException(String message, Throwable cause) { 
        super(message, cause);
    }
}

3.在contronllerExceptionHander拦截器中设置逻辑判断

package com.lrm.blog.hander;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;

@ControllerAdvice
public class controllerExceptionHander { 

    public final Logger logger = LoggerFactory.getLogger(this.getClass());

    @ExceptionHandler(Exception.class)
    public ModelAndView exceptionHander(HttpServletRequest request, Exception e){ 
        logger.error("Requst RUL :{},Exception :{}",request.getRequestURI(), e);
//逻辑判断是否存在改变状态的注解
        if (AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){ 
            throw e;
        }
        ModelAndView mv = new ModelAndView();
        Object attributeName;
        mv.addObject("url",request.getRequestURI());
        mv.addObject("exception",e);
        mv.setViewName("error/error");
        return mv;
    }
}

此时重启spring boot访问8080显示为404页面

    原文作者:weixin_48102099
    原文地址: https://blog.csdn.net/weixin_48102099/article/details/115225806
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。