SpringBoot异常处理

统一异常处理@ControllerAdvice+@ExceptionHandler

本文章向大家介绍统一异常处理@ControllerAdvice+@ExceptionHandler,主要包括统一异常处理@ControllerAdvice+@ExceptionHandler使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

 
统一异常处理


一、对异常的处理使用统一的异常处理流程:

1、自定义异常类型。
2、自定义错误代码及错误信息。
3、对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。 可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,由于是程序员抛出的异常,通常异常信息比较 齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
4、对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。 不可预知异常通常是由于系统出现bug、或一些不要抗拒的错误(比如网络中断、服务器宕机等),异常类型为 RuntimeException类型(运行时异常)。
5、可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随请求响应给客户端。

二、抛出及处理流程:

1、在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型
2、统一由异常捕获类捕获异常,并进行处理 。
3、获到自定义异常则直接取出错误代码及错误信息,响应给用户。
4、捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,如果有则取出错误代码和错误 信息并响应给用户,如果从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。
5、将错误代码及错误信息以Json格式响应给用户。

三、可预知异常处理

1.自定义异常捕获类

import java.util.HashMap;
import java.util.Map;

import org.hibernate.criterion.NullExpression;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Map<String, Object> exception(Exception e){
        e.printStackTrace();
        Map<String, Object> map =new HashMap<String, Object>();
        map.put("code", "500");
        map.put("msg", "run time exception");
        
        return map;
    }
    
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public Map<String, Object> exception2(Exception e){
        e.printStackTrace();
        Map<String, Object> map =new HashMap<String, Object>();
        map.put("code", "500");
        map.put("msg", "空指针异常");
        
        return map;
    }
}
 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.myspringboot.service.UsersServices;

@RestController
public class UserController2 {

    @Autowired
    private UsersServices usersServices;
    @RequestMapping("/select2")  //
    @ResponseBody
    public Object select(Integer id) {
        return this.usersServices.select(id);
    }
    
    @RequestMapping("/e1")  //
    @ResponseBody
    public Object e1() {
        int a =1/0;
        return "hello e1";
    }
    
    @RequestMapping("/e2")  //
    @ResponseBody
    public Object e2() {
        String  a =null;
        a.substring(1);
        return "hello e2";
    }

}
 

网址输入:http://127.0.0.1:8080/e1

  网址输入:http://127.0.0.1:8080/e2

其他参考文案

统一异常处理@ControllerAdvice+@ExceptionHandler - 码农教程

SpringBoot拦截器的使用

1.自定义拦截器,并重写方法

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


@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println("开始拦截。。。。。。");
        String token = (String)request.getHeader("token");
        if(token==null||token=="") {
            response.getWriter().print("Meiyou token");
            return false;
        }
        return true;
    }

 }

import com.myspringboot.aop.LoginInterceptor;

@Configuration //bean xml文件
public class WebConfig {

    @Autowired
    private LoginInterceptor loginInterceptor;

    
    @Bean
    public WebMvcConfigurer config() {
        return new WebMvcConfigurer() {
            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                registry.addInterceptor(loginInterceptor);
                
            }
            }

}

   网址输入:

http://127.0.0.1:8080/name

因为header没有携带Token,所以被拦截,并显示代码中的文本

 

SpringBoot提供了一套默认的异常处理机制。一旦程序出现异常SpringBoot会向/error的URL发送请求,并通过BasicErrorController来处理该请求。默认情况下,SpringBoot会跳转到默认显示异常信息的页面来展示异常信息。如果我们希望将所有的异常统一跳转到自定义的错误页面,可以在src/main/resources/templates目录下创建一个名为error.html的页面。通过覆盖默认的错误页面,我们可以实现自定义的异常处理。 除了使用SpringBoot的默认配置外,还可以通过自定义错误页面来处理异常。我们可以在src/main/resources/templates目录下创建error.html页面,并将其命名为error。通过这种方式,我们可以自定义错误页面的内容和样式来展示异常信息。 在处理异常的过程中,可以关注ErrorMvcAutoConfiguration中的三个关键点。通过对SpringBoot错误处理机制源码的跟踪,我们可以更深入地了解异常处理的实现细节。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot异常处理](https://blog.csdn.net/Linging_24/article/details/126077782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot 异常处理详解](https://blog.csdn.net/qq_42402854/article/details/91415966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值