26.1.从零开始学springboot-全局异常处理

SpringBoot处理全局异常详解(全面详细+Gitee源码) 我们对常见的七种异常情况统一进行处理,这次的主角就是@RestControllerAdvice这个注解,这个一个组合注解由@ControllerAdvice和@ResponseBody组成,@RestControllerAdvice会帮助我们把信息转成json格式返回。在全局异常处理类只需要在类上标注@RestControllerAdvice,并在处理相应异常的方法上使用@ExceptionHandler注解,写明处理哪个异常即可。注:异常的拦截有顺序,子类异常会优先匹配子类异常处理器。 阅读详情

前言

无论什么项目,异常处理和数据校验都显得尤其重要。作为一个开发,我们不应该不对数据检验就直接入库,我们也不应该傻乎乎的把乱糟糟的报错信息直接返回给用户。本章,我们就讲讲sprinboot的异常和数据校验处理。

异常处理流程

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

默认异常处理

默认情况下,sprinboot为两种情况提供了不同的响应方式。

  • 浏览器异常处理
    浏览器客户端请求一个不存在的页面或服务端处理发生异常时,一般情况下浏览器默认发送的请求头中Accept: text/html,sprinboot默认会响应一个html文档内容,称作“Whitelabel Error Page”。
    1.png

  • 非浏览器异常处理
    如postman等调试工具发送请求一个不存在的url或服务端处理发生异常时,sprinboot会返回类似如下的Json格式字符串信息
    2.png

默认异常处理原理简介

sprinboot默认提供了程序出错的结果映射路径“/error”。这个“/error”请求会在BasicErrorController类中处理
我们找到该类,简单看些核心实现
3.png
不难看出其内部是通过判断请求头中的Accept的内容是否为text/html来区分请求是来自浏览器,还是其它接口的调用,以此来决定返回页面视图还是 json 消息内容。

全局异常处理

以上介绍了springboot默认的异常处理机制,那么,问题来了,我们实际业务中肯定是需要统一的消息体的。所以,我们就需要实现ErrorController这个接口,来统一返回的消息体。
(PS:也可以直接继承BasicErrorController,该中已经有一个默认处理text/html的方法。如果你想添加一个新内容类型(如JSON)的处理程序,你需要添加一个具有@RequestMapping属性的方法,然后返回你自定义的实体类)。

package com.mrcoder.sbexceptionvalidator.controller;
import com.mrcoder.sbexceptionvalidator.common.model.ResponseInfo;
import com.mrcoder.sbexceptionvalidator.model.Person;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
@RestController
public class ExceptionValidatorController implements ErrorController {
    @RequestMapping("/error")
    public ResponseInfo handleError(HttpServletRequest request) {
        //获取statusCode:401,404,500
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        return ResponseInfo.fail(statusCode);
    }
    @Override
    public String getErrorPath() {
        return "/error";
    }
}

此时,再访问不存在的url你会发现返回的消息体已经是我们定义的了。
浏览器:
5.png
非浏览器:
4.png

自定义全局异常处理

上面我们提到ErrorController可对全局错误进行处理,但是有如下几点问题:

  • 获取不到异常的具体信息
  • 无法根据异常类型进行不同的响应,例如对自定义异常的处理。(PS:实际开发中我们常常会定义各种业务的自定义异常)。

实际上,当出现错误,如获取值为空或出现异常时,我们并不希望用户看到异常的具体信息,而是希望对对应的错误和异常做相应提示
在MVC框架中很多时候会出现执行异常,那我们就需要加try/catch进行捕获,如果service层和controller层都加上,那就会造成代码冗余。

而@ControllerAdvice可对全局异常进行捕获,包括自定义异常(也就是我们自定定义的业务异常)
需要注意的是,@ControllerAdvice是应用于对springmvc中的控制器抛出的异常进行处理,而对于404/500这类的异常不会进入控制器处理的异常不起作用,所以404这类的还是要依靠实现ErrorController接口来处理。

我们定义一个错误码枚举类

package com.mrcoder.sbexceptionvalidator.common.status;
import com.mrcoder.sbexceptionvalidator.common.model.ResponseInfo;
/**
 * @Description: 系统错误类型枚举类
 */
public enum ErrorCodeEnum {
    SYSTEM_ERROR(ResponseInfo.FAIL_CODE, "系统异常,请稍后重试"),
    NO_AUTHORITY(ResponseInfo.FAIL_CODE, "无权访问"),
    PARAM_ERROR(ResponseInfo.FAIL_CODE, "参数非法"),
    NOT_LOG(ResponseInfo.FAIL_CODE, "当前用户未登录");
    private Integer errCode;
    private String errMsg;
    private ErrorCodeEnum(Integer errCode, String errMsg) {
        this.errCode = errCode;
        this.errMsg = errMsg;
    }
    public Integer getErrCode() {
        return errCode;
    }
    public String getErrMsg() {
        return errMsg;
    }
}

再定义一个业务异常类型

package com.mrcoder.sbexceptionvalidator.common.exception;


import com.mrcoder.sbexceptionvalidator.common.model.ResponseInfo;
import com.mrcoder.sbexceptionvalidator.common.status.ErrorCodeEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * @Description: 全局业务异常类型
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class BusinessException extends RuntimeException {
    private static final long serialVersionUID = -6842004487143726249L;
    private Integer errCode;
    private String errMsg;
    public BusinessException(String errMsg) {
        super();
        this.errCode = ResponseInfo.FAIL_CODE;
        this.errMsg = errMsg;
    }
    public BusinessException(ErrorCodeEnum errorCodeEnum) {
        super();
        this.errCode = errorCodeEnum.getErrCode();
        this.errMsg = errorCodeEnum.getErrMsg();
    }
}

最后全局异常处理器

package com.mrcoder.sbexceptionvalidator.common.exception;


import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolationException;

import com.mrcoder.sbexceptionvalidator.common.model.ResponseInfo;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * @Description: 全局异常捕获处理器
 */
@ControllerAdvice
public class GlobalExpectionHandler {
    /**
     * 异常捕获处理
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ResponseInfo expectionHandler(HttpServletRequest request, Exception e) {
        if (e instanceof MethodArgumentNotValidException) { // JavaBean参数校验异常
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
            List<ObjectError> allErrors = exception.getBindingResult().getAllErrors(); // 取出错误信息
            ObjectError error = allErrors.get(0); // 只返回第一个错误信息即可
            return ResponseInfo.fail(error.getDefaultMessage());
        } else if (e instanceof ConstraintViolationException) { // Controller方法参数校验异常
            // 错误异常
            String message = ((ConstraintViolationException) e).getConstraintViolations().iterator().next().getMessage();
            return ResponseInfo.fail(message);
        } else if (e instanceof BusinessException) {
            // 自定义业务异常
            BusinessException exception = (BusinessException) e;
            return ResponseInfo.fail(exception.getErrMsg());
        } else {
            // 系统异常,打印错误日志
            e.printStackTrace();
            return ResponseInfo.fail("系统异常,请稍后重试");
        }
    }
}

项目地址

https://github.com/MrCoderStack/SpringBootDemo/tree/master/sb-exception-validator

请关注我的订阅号

订阅号.png

手把手教你用Matlab解析Zygo .dat文件:从二进制数据到面形图(附完整流程) 本文详细介绍了如何使用Matlab解析Zygo干涉仪生成的.dat文件,从二进制数据读取到面形图可视化的完整流程。通过实例代码演示了文件结构解析、数据矩阵读取、高阶Zernike拟合等关键技术,帮助工程师和研究人员高效处理光学检测数据,提升分析精度和工作效率。 阅读详情

相关推荐

现代SerDes解剖:从CTLE/DFE到PAM4与ADC+DSP架构

高速有线通信的物理层瓶颈,正从并行总线的时钟偏斜转向串行链路的信号完整性挑战。SerDes作为解决这一问题的核心技术,其内部架构远超“并转串”的朴素认知。接收端的CTLE线性均衡与DFE判决反馈均衡,配合CDR时钟恢复,共同构成对抗信道损耗与码间干扰的关键机制。随着速率迈向56G/112G,PAM4调制以电平幅度换取带宽,而ADC+DSP架构则把均衡算法搬入数字域,实现更灵活的非线性补偿。理解这些模块如何协同工作,是调试PCIe、以太网等高速链路、优化眼图余量与抖动预算的基础,也是硬件工程师从盲目调参走向系

weixin_29194817的博客 295

Tomcat对String的编码处理

转载:请注明http://csdn.net作者:ggyy1977@hotmail.com Tomcat的中文处理(一)看到很多朋友问关于中文的处理问题,下面我们以tomcat4.0为servlet,jsp引擎来说说unicode的处理。1)       从客户端接受请求当客户端请求tomcat的一个jsp文档的时候,tomcat会构造相应的httpServletReques

ggyy的专栏 1413

Android手机本地语音转文字实战:用FunASR+ONNX Runtime打造离线ASR应用(附模型下载)

本文详细介绍了如何在Android应用中集成FunASR和ONNX Runtime,构建高性能的离线语音识别系统。通过模型选择、工程化集成和性能调优等实战技巧,开发者可以实现本地语音转文字功能,有效保护用户隐私并提升响应速度。

weixin_29046611的博客 266

tomcat 导致的字符乱码的问题 eclpise字符乱码

在Eclipse中打开server.xml (或者在tomcat中找到server.xml打开) crlt + f  查询 8080    在红箭头的地方加上 URLEncoding="utf-8"

蝴蝶飞、不飞的博客 278

【Solidworks学习使用(1)__2022版本保姆级安装方法】

Solidworks 2020安装

coder-kimbell的博客 6247

数学建模:相关性分析学习——皮尔逊(pearson)相关系数与斯皮尔曼(spearman)相关系数

相关性分析:求解相关系数并绘制热力图进行对比

weixin_67565775的博客 8万+

Tomcat日志

1 Tomcat 日志概述 Tomcat 日志分为下面5类: catalina:Cataline引擎的日志文件,文件名catalina.日期.log localhost:Tomcat下内部代码丢出的日志,文件名localhost.日期.log manager:Tomcat下默认管理应用日志,文件名manager.日期.log host-manager:虚拟主机方面 (1~4 以上默认...

0_0的博客 999

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2150

Tomcat源码运行控制台乱码解决方案

碰到Tomcat源码运行时控制台乱码的解决方案: 1. Ctrl+N 找到 org.apache.tomcat.util.res.StringManager类 Ctrl+F找到getString(final String key, final Object... args)方法,将代码更改为 public String getString(final String key, final Object... args) { String value = getString(ke..

hyc的博客 650

AD快速上手笔记

本文详细介绍了使用Altium Designer从零创建PCB项目全流程:新建工程、绘制原理图(元件放置、连线、电源端口)、编译检查、生成PCB、布局布线(含铺铜)、DRC检查及输出Gerber与钻孔文件。重点强调了库选择、参数修改、层切换、铺铜设置和生产文件导出规范,确保设计无误,便于顺利下单生产。

qq_53529450的博客 41

1.2 机器人控制系统软硬件平台

工业机器人的软硬件平台架构是影响工业机器人性能和效率的重要因素。良好的软硬件平台架构可以帮助工业机器人更加稳定和高效地完成工作,提高生产效率。正确的软硬件配置还可以提高工业机器人的灵活性和可靠性,使其能够更好地适应不断变化的生产环境。 同时,工业机器人的软硬件平台架构还可以影响工业机器人的安全性和维护成本。如果软硬件平台架构不合适,工业机器人可能出现故障或安全隐患,需要大量的维护和维修费用。因此,选择适当的软硬件平台架构对于确保工业机器人的高效运行和长期使用是非常重要的。

Galaxy_Robot的博客 2万+

记录工作第3周中遇到的问题-包依赖冲突导致的问题

写于0523 星期三 昨晚推上线,可是又死掉了。解除绑卡操作后,重新绑卡的时候,无法获取验证码。 今早一起研究日志,顺着日志的记录,调用发送验证码的service方法的时候,发现这么一个问题: HttpResponse response = HttpUtils.doPost(host, path, "", new HashMap&lt;String, String&gt;(), querys...

LLLLEE 的博客 726

Oracle EBS R12 AR 标准发票 核心表结构

​ Oracle EBS R12 AR 标准发票 核心表结构 聚焦手动标准发票 (Standard Invoice),按头→行→分配→税→收款计划→会计分录→历史分层,标注主键、外键、关键字段、业务含义,同时说明表间关联关系,适配开发 / 运维 / 数据核对场景。 一、主数据层(发票头 + 行,核心业务表) 1. RA_CUSTOMER_TRX_ALL 【发票头表】 作用:存储整张发票头部信息,一张发票对应一条记录,AR 发票主表。 主键:CUSTOMER_TRX_ID (唯一 ID,系统内部键) 业

金牌架构师 280

【SpringBoot学习】26、SpringBoot 全局异常处理

文章目录什么是 Actuator?准备工作修改 application.yml断点概念测试监控相关链接微信公众号 什么是 Actuator? 从本质上讲,Actuator为我们的应用程序带来了生产就绪功能。 通过这种依赖关系监控我们的应用程序,收集指标,了解流量或数据库的状态变得微不足道。 这个库的主要好处是我们可以获得生产级工具,而无需自己实际实现这些功能。 Actuator 主要用于公开有关正在运行的应用程序的运行信息 - 运行状况,指标,信息,转储,env 等。它使用HTTP端点或JMX bean来使

Tellsea 1009

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SpringBoot处理全局异常详解(全面详细)

这次博客的主角就是@RestControllerAdvice这个注解,这个一个组合注解由@ControllerAdvice和@ResponseBody组成,@RestControllerAdvice会帮助我们把信息转成json格式返回。在全局异常处理类只需要在类上标注@RestControllerAdvice,并在处理相应异常的方法上使用@ExceptionHandler注解,写明处理哪个异常即可。注:异常的拦截有顺序,子类异常会优先匹配子类异常处理器。

DN金猿的博客 2692

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Springboot全局异常处理

1、全局异常处理,指的是对于程序中产生的Exception进行的处理。产生了异常之后,可以统一跳转到一个页面进行错误提示,也可以通过Restful形式返回错误信息。   注意:关于全局错误与全局异常的区别。全局错误,指的是对http状态码进行的错误跳转处理,全局异常指的是发生某些异常(如果处理的是Exception,则表示处理全部异常)之后的跳转页面。两者属于并行的概念,在项目开发中建议...

HiterCoder 427

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

springboot的异常处理-设置全局异常处理

一.说明 1.1 全局异常设置 通过注解@ControllerAdvice 定义一个处理全局 异常的类,在需要捕捉异常的方法上加上@ExceptionHandler(value=Exception.class)这个注解。 @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody 如下图 二 案例操作 2.1 执行逻辑 配置一个检测异常的全局类,发生异常时,根据配置的code,msg,url等信息,以j

健康平安的活着的专栏 2180

Springboot2.0全局异常捕捉处理和自定义全局异常处理

一,全局异常捕捉处理 新建MyControllerAdvice类,建在包下都有作用: import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframew...

飞奔的波大爷的博客 2万+

SpringBoot优雅的全局异常处理(二)——@RestControllerAdvice@ExceptionHandler方式

前言 SpringBoot版本:2.1.9.RELEASE Mybatis Plus版本:3.3.0 上篇文章主要是讲的SpringBoot非web项目的全局异常处理方式,现在来讲一下web注解的方式。 一、新建自定义异常处理类GlobalExceptionHandler。 package com.junya.util.exception; import com.junya.util.re...

The man was lazy and left no message 1167

SpringBoot 全局异常处理:@ControllerAdvice 与全局异常格式

如果没有全局统一管控,接口一旦报错,要么直接甩给前端一堆异常堆栈,要么返回格式五花八门,前端无法解析,日志无法统一收集,线上问题更是难以排查。参数错误 400、未登录 401、无权限 403、业务错误 6xx、系统错误 500,一目了然。无论参数错、业务错、系统错,前端永远只收到一套 JSON 结构,不用适配 N 种错误。参数异常、JSON 解析异常、方法不支持、空指针、数据库异常、业务异常、兜底异常。可以精确捕获:参数异常、空指针、SQL 异常、自定义业务异常等。记录完整异常,前端只收简洁信息。

。。。 619

SpringBoot之自定义全局异常处理器

版本:SpringBoot 2.0.4 工具:eclipse 2018-09 (4.9.0) 在项目中一般都会用@ControllerAdvice来进行全局异常捕获机制,但是这种异常处理方式一般是用来处理应用级别的异常,有一些容器级别的错误就处理不了,例如Filter抛出异常,使用@ControllerAdvice定义的全局异常处理机制就无法处理,如果我们需要更加灵活的对ERROR视图和数据进行处...

New_Yao的博客 2461

SpringBoot中全局异常处理

参考:这里 统一返回UI格式类型 1 public class CommonReturnType { 2 //返回给UI的数据 3 private Object data; 4 //返回给UI的状态 5 private String status; 6 7 public static CommonReturnTy...

weixin_30443895的博客 174

Springboot捕获全局异常404-NoHandlerFoundException及Swagger/静态路由处理

1、解决Spring MVC no handler抛出异常 - 简书 (jianshu.com)https://www.jianshu.com/p/80e7b7fc374e 现如今每一个网站都会有自己的404页面,但是作为一个纯后端的应用,肯定是没有静态资源的,这辈子也不可能会有静态资源 对于Spring MVC它有自己的一套404返回,例如这样 { "timestamp": "2018-09-26T17:03:41.161+0800", "status": 404, "error": "Not Fo

z69183787的专栏 8172

SpringBoot全局异常处理+后端统一返回(附源码)

本文主要介绍SpringBoot前后端分离开发模式下,如何友好与前端进行交互。包含controller层统一返回处理,全局异常捕获。文章只粘出关键代码,源码已上传至github,文末获取。

随笔 768

全局异常处理器解析(附带源码)

全局异常处理器解析,附带源码

qq_59093178的博客 512

SpringBoot2.3.12.RELEASE优雅的全局异常处理(模板一)

参考:https://www.cnblogs.com/xuwujing/p/10933082.html 1、首先,需要引入maven依赖包,如下所示: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi=...

HiterCoder 1988
上一篇: 25.从零开始学springboot-springboot2.1.x报错循环依赖问题
下一篇: 26.2.从零开始学springboot-数据校验
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值