我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Cloud Zuul中异常处理细节有哪些

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Cloud Zuul中异常处理细节有哪些

本篇内容主要讲解“Spring Cloud Zuul中异常处理细节有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud Zuul中异常处理细节有哪些”吧!

首先我们来看一张官方给出的Zuul请求的生命周期图,如下:

Spring Cloud Zuul中异常处理细节有哪些  

关于这张图我说如下几点:

正常情况下所有的请求都是按照pre、route、post的顺序来执行,然后由post返回response
2.在pre阶段,如果有自定义的过滤器则执行自定义的过滤器
3.pre、routing、post的任意一个阶段如果抛异常了,则执行error过滤器,然后再执行post给出响应

这是这张图给我们的信息,我们再来看看源码com.netflix.zuul.http.ZuulServlet类中的service方法,这是整个调用过程的核心,如下:

try {    init((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse);    // Marks this request as having passed through the "Zuul engine", as opposed to servlets    // explicitly bound in web.xml, for which requests will not have the same data attached    RequestContext context = RequestContext.getCurrentContext();    context.setZuulEngineRan();    try {        preRoute();    } catch (ZuulException e) {        error(e);        postRoute();        return;    }    try {        route();    } catch (ZuulException e) {        error(e);        postRoute();        return;    }    try {        postRoute();    } catch (ZuulException e) {        error(e);        return;    }} catch (Throwable e) {    error(new ZuulException(e, 500, "UNHANDLED_EXCEPTION_" + e.getClass().getName()));} finally {    RequestContext.getCurrentContext().unset();}

我们看到这里有一个大的try…catch,大的try…catch里边有三个小的try…catch,小的try…catch只负责捕获ZuulException异常,其他的异常交给大的try…catch来捕获。pre和route执行出错之后都会先执行error再执行post,而post执行出错之后就只执行error而不会再执行post。

ZuulFilter最终会在com.netflix.zuul.FilterProcessor的processZuulFilter方法中被调用,在该方法中会判断runFilter是否执行成功,如果执行失败,则将异常信息提取出来,然后抛出异常,抛出的异常如果是ZuulException的实例,则抛出一个ZuulException类型的异常,如果不是ZuulException的实例,则抛出一个状态码为500的ZuulException类型的异常,所以无论如何,我们最终看到的都是ZuulException类型的异常,下面我贴出processZuulFilter方法的一部分核心代码,如下:

public Object processZuulFilter(ZuulFilter filter) throws ZuulException {    try {        ZuulFilterResult result = filter.runFilter();        ExecutionStatus s = result.getStatus();        execTime = System.currentTimeMillis() - ltime;        switch (s) {            case FAILED:                t = result.getException();                ctx.addFilterExecutionSummary(filterName, ExecutionStatus.FAILED.name(), execTime);                break;            case SUCCESS:                break;            default:                break;        }        if (t != null) throw t;        usageNotifier.notify(filter, s);        return o;    } catch (Throwable e) {        usageNotifier.notify(filter, ExecutionStatus.FAILED);        if (e instanceof ZuulException) {            throw (ZuulException) e;        } else {            ZuulException ex = new ZuulException(e, "Filter threw Exception", 500, filter.filterType() + ":" + filterName);            ctx.addFilterExecutionSummary(filterName, ExecutionStatus.FAILED.name(), execTime);            throw ex;        }    }}

在Zuul中,所有的错误问题的最终都是被SendErrorFilter类来处理,该类在早期的版本是一个post类型的filter,post类型的filter有一个缺陷就是不能处理post中抛出的异常,需要我们手动去完善,而我目前使用的这个版本(Dalston.SR3)已经修复了这个问题,SendErrorFilter现在是一个error类型的filter,而且只要RequestContext中有异常就会进入到SendErrorFilter中,错误信息也都从exception对象中提取出来,核心代码如下:

@Overridepublic boolean shouldFilter() {    RequestContext ctx = RequestContext.getCurrentContext();    // only forward to errorPath if it hasn't been forwarded to already    return ctx.getThrowable() != null            && !ctx.getBoolean(SEND_ERROR_FILTER_RAN, false);}@Overridepublic Object run() {    try {        RequestContext ctx = RequestContext.getCurrentContext();        ZuulException exception = findZuulException(ctx.getThrowable());        HttpServletRequest request = ctx.getRequest();        request.setAttribute("javax.servlet.error.status_code", exception.nStatusCode);        log.warn("Error during filtering", exception);        request.setAttribute("javax.servlet.error.exception", exception);        if (StringUtils.hasText(exception.errorCause)) {            request.setAttribute("javax.servlet.error.message", exception.errorCause);        }        RequestDispatcher dispatcher = request.getRequestDispatcher(                this.errorPath);        if (dispatcher != null) {            ctx.set(SEND_ERROR_FILTER_RAN, true);            if (!ctx.getResponse().isCommitted()) {                dispatcher.forward(request, ctx.getResponse());            }        }    }    catch (Exception ex) {        ReflectionUtils.rethrowRuntimeException(ex);    }    return null;}

如果我们想要自定义异常信息也很方便,如下:

@Componentpublic class MyErrorAttribute extends DefaultErrorAttributes {    @Override    public Map<String, Object> getErrorAttributes(RequestAttributes requestAttributes, boolean includeStackTrace) {        Map<String, Object> result = super.getErrorAttributes(requestAttributes, includeStackTrace);        result.put("status", 222);        result.put("error", "error");        result.put("exception", "exception");        result.put("message", "message");        return result;    }}

到此,相信大家对“Spring Cloud Zuul中异常处理细节有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring Cloud Zuul中异常处理细节有哪些

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring Cloud Zuul中异常处理细节有哪些

本篇内容主要讲解“Spring Cloud Zuul中异常处理细节有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud Zuul中异常处理细节有哪些”吧!首先我们来看一张
2023-06-19

Spring Cloud Stream的使用细节有哪些

Spring Cloud Stream的使用细节有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。上我们就来看看Spring Cloud Stream的一些使用细节。自定义消
2023-06-19

spring处理异常的方法有哪些

Spring提供了多种处理异常的方法,包括:1. 使用@ControllerAdvice注解的类:可以全局捕获和处理Controller层抛出的异常,可以在该类中定义多个@ExceptionHandler方法来处理不同类型的异常。2. 使用
2023-08-18

Python中有哪些异常处理机制

Python中有哪些异常处理机制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。>>>>>> try: raise Exception("a", "b")
2023-06-17

python中有哪些异常处理技巧

这篇文章给大家介绍python中有哪些异常处理技巧,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自
2023-06-14

Java中异常处理误区有哪些

这篇文章将为大家详细讲解有关Java中异常处理误区有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。误区一、异常的选择图 1. 异常分类图 1 描述了异常的结构,其实我们都知道异常分检测异常和非检测异常
2023-05-30

Python中异常处理用法有哪些

本篇内容主要讲解“Python中异常处理用法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中异常处理用法有哪些”吧!为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,
2023-06-21

python中有哪些异常处理关键字

这篇文章给大家介绍python中有哪些异常处理关键字,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么
2023-06-14

python中异常处理的作用有哪些

Python中的异常处理有以下作用:1. 防止程序因为错误而崩溃:异常处理可以捕获程序运行中出现的错误,并采取相应的措施来避免程序崩溃。如果不进行异常处理,程序遇到错误时会直接停止运行,导致后续的代码无法执行。2. 提高程序的可靠性:通过捕
2023-09-06

Python中的异常处理技巧有哪些?

Python中的异常处理技巧有哪些?需要具体代码示例Python是一种易于学习和使用的编程语言,它提供了强大的异常处理机制,可以帮助程序员增强代码的可靠性和可维护性。在编写Python程序时,我们经常会遇到各种各样的异常情况,如文件读写错误
2023-10-22

python中异常处理的过程有哪些

这篇文章将为大家详细讲解有关python中异常处理的过程有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向
2023-06-14

redis异常处理方法有哪些

在Redis中,可以通过以下几种方式处理异常:1. 异常捕获:在Redis操作过程中,可以使用try-catch语句来捕获异常,并在catch块中处理异常情况。2. 返回错误信息:Redis的操作会返回相应的错误信息,可以通过检查返回结果来
2023-09-16

C++ 函数异常处理中常见陷阱有哪些?

c++++ 函数异常处理中常见的陷阱:避免在异常处理块中返回局部变量引用或指针,以免指向无效内存。异常处理块中不要重复抛出异常,以免覆盖原始异常信息。谨慎使用 noexcept 指定符,确保函数确实不会抛出异常。使用智能指针和异常规范,以提
C++ 函数异常处理中常见陷阱有哪些?
2024-04-24

Java中异常处理的关键字有哪些

Java中的异常处理关键字有以下几个:try:用于标识要捕获异常的代码块。catch:用于捕获指定类型的异常,并在捕获到异常时执行相应的代码块。finally:用于定义无论是否发生异常都将执行的代码块。throw:用于手动抛出异常。thro
Java中异常处理的关键字有哪些
2024-02-29

c++异常处理的方法有哪些

在C++中,有以下几种异常处理的方法:1. try-catch语句块:使用try-catch语句块可以捕获和处理异常。在try块中编写可能会引发异常的代码,然后在catch块中捕获并处理这些异常。可以使用多个catch块来处理不同类型的异常
2023-10-10

Java异常的处理方式有哪些

这篇文章主要介绍“Java异常的处理方式有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java异常的处理方式有哪些”文章能帮助大家解决问题。什么是异常?异常在我们写代码是特别常见,因为程序员大
2023-06-30

golang异常处理关键词有哪些

在Go语言中,异常处理是使用关键字panic和recover来实现的。下面是一些与异常处理相关的关键词。panic:panic关键字用于引发异常。当某个错误或不可恢复的状态发生时,可以使用panic来中断程序的正常执行,并引发一个异常。re
golang异常处理关键词有哪些
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录