首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用ResponseErrorHandler从ResponseStatusException获取错误消息

ResponseErrorHandler是Spring框架中的一个接口,用于处理HTTP响应错误。它可以通过ResponseStatusException类获取错误消息。

ResponseStatusException是Spring框架中的一个异常类,用于表示HTTP响应的状态码和错误消息。它包含了以下几个重要的属性:

  1. status:表示HTTP响应的状态码。
  2. reason:表示HTTP响应的原因短语,即状态码对应的描述信息。
  3. responseHeaders:表示HTTP响应的头部信息。
  4. responseBody:表示HTTP响应的主体内容。

使用ResponseErrorHandler从ResponseStatusException获取错误消息的步骤如下:

  1. 创建一个实现ResponseErrorHandler接口的类,例如CustomResponseErrorHandler。
  2. 在CustomResponseErrorHandler类中,实现handleError方法,该方法接收一个ClientHttpResponse参数,用于处理HTTP响应错误。
  3. 在handleError方法中,通过ClientHttpResponse的getStatusCode方法获取HTTP响应的状态码。
  4. 如果状态码表示错误(如4xx或5xx),则通过ClientHttpResponse的getBody方法获取HTTP响应的主体内容,并将其转换为字符串。
  5. 创建一个ResponseStatusException对象,将状态码和主体内容作为参数传入。
  6. 可以通过ResponseStatusException的getMessage方法获取错误消息。

使用ResponseErrorHandler从ResponseStatusException获取错误消息的示例代码如下(以Java语言为例):

代码语言:txt
复制
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.web.client.ResponseErrorHandler;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.ResponseExtractor;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;

public class CustomResponseErrorHandler implements ResponseErrorHandler {

    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
        return new DefaultResponseErrorHandler().hasError(response);
    }

    @Override
    public void handleError(ClientHttpResponse response) throws IOException {
        HttpStatus statusCode = response.getStatusCode();
        if (statusCode.is4xxClientError() || statusCode.is5xxServerError()) {
            String responseBody = new BufferedReader(new InputStreamReader(response.getBody()))
                    .lines().collect(Collectors.joining("\n"));
            throw new ResponseStatusException(statusCode, responseBody);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new CustomResponseErrorHandler());

        try {
            String url = "http://example.com/api/endpoint";
            String response = restTemplate.getForObject(url, String.class);
            // 处理正常响应
        } catch (ResponseStatusException ex) {
            String errorMessage = ex.getMessage();
            // 处理错误响应
        }
    }
}

在上述示例代码中,我们自定义了一个CustomResponseErrorHandler类,实现了ResponseErrorHandler接口。在handleError方法中,我们通过ClientHttpResponse的getStatusCode方法获取状态码,并通过getBody方法获取主体内容。然后,我们创建了一个ResponseStatusException对象,将状态码和主体内容作为参数传入。最后,在主函数中,我们使用RestTemplate发送HTTP请求,并通过try-catch块捕获ResponseStatusException异常,从而获取错误消息。

请注意,上述示例代码中使用的是Spring框架中的RestTemplate类来发送HTTP请求。如果你使用其他的HTTP客户端库,可以根据具体的库文档来实现相应的错误处理逻辑。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云API网关:https://cloud.tencent.com/product/apigateway
  • 腾讯云Serverless云函数:https://cloud.tencent.com/product/scf
  • 腾讯云容器服务:https://cloud.tencent.com/product/ccs
  • 腾讯云数据库:https://cloud.tencent.com/product/cdb
  • 腾讯云CDN加速:https://cloud.tencent.com/product/cdn
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网平台:https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发:https://cloud.tencent.com/product/mobdev
  • 腾讯云对象存储:https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务:https://cloud.tencent.com/product/tbaas
  • 腾讯云游戏多媒体引擎:https://cloud.tencent.com/product/gme
  • 腾讯云元宇宙:https://cloud.tencent.com/product/tencent-realtime-rendering
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Android 异步操作】手写 Handler ( 消息队列 MessageQueue | 消息保存到链表 | 链表中获取消息 )

---- Looper 调用 loop 方法后 , 会一直循环 , 不断地 消息队列 MessageQueue 中取出 Message 消息 , 然后 将 Message 消息发送给对应的 Handler...执行对应的操作 ; 消息队列 MessageQueue 中取出消息 , 也是 取出链表表头 的操作 , 取出该链表的表头 , 然后 将表头设置成链表的第二个元素 ; 消息同步 : 如果当前链表为空..., 此时会 调用 wait 方法阻塞 , 直到消息入队时 , 链表中有了元素 , 会调用 notify 解除该阻塞 ; /** * 消息队列中获取消息 * @return...可能会有多个线程 通过 Handler 向消息队列中添加消息 // 因此 需要使用同步代码块包裹以下逻辑 synchronized (this){...previous.next = msg; } notify(); } } /** * 消息队列中获取消息

1.3K00
  • 如何处理Feign的超时问题

    我们可以使用try-catch块来捕获该异常,并采取适当的措施。例如,我们可以使用重试机制来重新执行请求,或者返回一个默认值或错误消息。...在catch块中,我们使用ResponseStatusException类来抛出一个HTTP 500错误,表示获取用户信息失败。...同时,我们将原始异常FeignException作为参数传递给ResponseStatusException类,以便将其记录到日志中。...处理Feign的超时回退除了使用重试机制和返回默认值或错误消息来处理超时异常外,Feign还提供了一种处理超时问题的机制,即超时回退。...在getUser方法中,我们返回一个Fallback User对象,表示获取用户信息失败,但仍然返回一个对象,以便应用程序能够继续运行。

    8K61

    关注点分离之RestTemplate的错误处理

    概览 在这个简短的教程中,将讨论如何实现一个自定义ResponseErrorHandler类并将其注入到RestTemplate实例中去,这样我们就可以在调用远程API时优雅地处理HTTP错误。...如果我们所有的远程调用都复用一个错误处理器,那就会更高效。 3....实现一个自定义ResponseErrorHandler 根据上面的需求,我们下面要实现的自定义ResponseErrorHandler,应该能够响应中读取HTTP状态,并且: 抛出一个对我们的应用程序有意义的异常...具体而言,我们需要使用RestTemplateBuilder来构建RestTemplate,并在响应流中替换DefaultResponseErrorHandler。...HttpStatus.NOT_FOUND) { throw new NotFoundException(); } } } } 接下来,我们使用

    68520

    WPF 裸 Win 32 的 WM_Pointer 消息获取触摸点绘制笔迹

    本文将告诉大家如何在 WPF 里面,接收裸 Win 32 的 WM_Pointer 消息消息里面获取触摸点信息,使用触摸点信息绘制简单的笔迹 开始之前必须说明的是使用本文的方法不会带来什么优势,既不能带来笔迹书写上的加速...大家可以尝试在 Touch 事件监听函数添加断点,通过堆栈可以看到是 Windows 消息循环来的 可以调用堆栈看到如下函数,此函数就是核心的 WPF 框架里面 WM_Pointer 消息获取触摸信息的代码...Win32 消息获取的触摸信息,和 WPF 提供的 Touch 或 Stylus 事件里面获取的触摸信息的来源是相同的 这时候也许有人会说,在 WPF 里面经过了一些封装,可能性能不如自己写的。...且别忘了消息 UI 线程里面获取的,无论你用不用 WPF 的事件,在 WPF 底层的解析消息获取触摸数据引发事件的代码都会跑,也就是无论你用不用,需要 WPF 干的活一点都没少。...这样就可以使用了 按照 WPF 最简逻辑实现多指顺滑的笔迹书写 博客提供的方法进行笔迹对接即可绘制出笔迹 这就是最简单的 Win32 消息接收 Pointer 消息绘制笔迹的方法 然而以上的方法也存在不少的问题

    14010

    【SpringBoot WEB 系列】RestTemplate 之非 200 状态码信息捕获

    [logo.jpg] 【SpringBoot WEB 系列】RestTemplate 之非 200 状态码信息捕获 前面介绍的 RestTemplate 的使用,都是接口正常返回 200 的状态码 case...,当返回非 200 状态码时,会直接抛异常,如果我希望能捕获异常,并针对正常获取返回的 message,可以如何处理呢?...; } 一个简单的鉴权逻辑如上,请求头中拿到Authorization对应的 value,并解析用户名密码,如果满足则正确返回;如果不存在 or 不满足,则返回 http 状态码为 401,并携带对应的提示信息...); } catch (Exception e) { log.info("exception with no auth error: {}", e); } 输出如下,走入了 catch 逻辑,异常堆栈中...一灰灰 Blog 尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激 下面一灰灰的个人博客,记录所有学习和工作中的博文,

    2.9K30

    SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(2)

    completion = completion.onErrorResume(ex -> handler.handle(exchange, ex)); } return completion; } 源码可以看出...onErrorResume 的意思是如果链路前面发生异常,则在这里捕获住异常同时调用 handler.handle(exchange, ex) 进行处理,如果使用阻塞代码理解,就相当于: try {...则使用异常里面的响应码和 HTTP 头填充响应的响应码和 HTTP 头 if (ex instanceof ResponseStatusException) { ServerHttpResponse...response = exchange.getResponse(); ResponseStatusException responseStatusException = (ResponseStatusException...add(name, value))); //返回响应完成 return response.setComplete(); } //抛出异常,继续链路异常处理 throw ex; 如果大家想封装自己统一的错误响应

    35510

    SpringWeb 系列教程 RestTemplate 4xx5xx 异常信息捕获

    200104-SpringWeb 系列教程 RestTemplate 4xx/5xx 异常信息捕获 近期使用 RestTemplate 访问外部资源时,发现一个有意思的问题。...因为权限校验失败,对方返回的 401 的 http code,此外返回数据中也会包含一些异常提示信息;然而在使用 RestTemplate 访问时,却是直接抛了如下提示 401 的异常,并不能拿到提示信息...那么 RestTemplate 如果希望可以获取到非 200 状态码返回数据时,可以怎么操作呢? I. 异常捕获 1....判定返回结果是否 ok 源码上看,主要是根据返回的 http code 来判断是否 ok // 根据返回的http code判断有没有问题 @Override public boolean hasError...一灰灰 Blog 尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激 下面一灰灰的个人博客,记录所有学习和工作中的博文,

    1.4K30

    “无法http:XXXXXX.svc?wsdl获取元数据”错误的解决方法

    昨天在用IIS部署一个WCF服务时,碰到了如下错误: 理解了文档内容,但无法进行处理。   - WSDL 文档包含无法解析的链接。  ...- 基础连接已经关闭: 接收时发生错误。   - 无法传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。   - 远程主机强迫关闭了一个现有的连接。...该错误是在使用svcutil生成client代码时报的错误,服务是部署在IIS7上,部署的过程都是完全教科书式的进行。服务也正常启动了,显示如下内容 已创建服务。...可以使用下列语法,从命令行中使用 svcutil.exe 工具来进行此操作: svcutil.exe http://leo-pc/IISHostService/Service1.svc?...wsdl命令去生成代码,就出现了开头说的那个错误。而如果用visual studio的webdevserver启动,则一切正常。

    3.5K20

    MYSQL 8 metadata开始到如何获得语句由于获取锁失败的错误

    p.time and i.trx_mysql_thread_id not in (connection_id(),p.id); 通过这个方式可以将长时间等待metadata lock 不工作的事务数据库中找出来...MYSQL 5.X我们都是去找到ERROR LOG ,里面去找寻可能发生的信息,但是MYSQL 8 我们在performance_schema 中已经有了 events_errors 系列,这些表可以让你各个层面来了解...MYSQL 在最近都发生过什么错误。...发生过全表扫描的情况 select * from events_errors_summary_by_user_by_error where last_seen is not null; 以上的这个表,主要是访问数据库的用户的角度来出发...,查看这个用户曾经发生过什么样的错误,我们可以改写一下这个查询的语句,来更精确的对这个账号发生过什么错误进行判断。

    1.9K30

    【Apache ShenYu源码】看看贡献者如何实现支持提醒通知设计

    相信大家碰到源码时经常无从下手,不知道哪开始阅读,面对大量代码晕头转向,索性就读不下去了,又浪费了一次提升自己的机会。我认为有一种方法,可以解决大家的困扰!...至此,我们发现自己开始大量堆砌的源码中脱离开来,柳暗花明又一村。 一、前瞻 Ok,开始我们今天的PR阅读。 翻译过来大致意思就是添加提醒通知的功能。...翻译如下: 支持提醒通知设计 Shenyu admin 提供警报报告 API,/alert/report用于网关 pulgin 接收警报内容 网关在警报触发时发送警报消息 神宇仪表板支持管理警报接收者名称...= StringUtils.hasLength(((ResponseStatusException) throwable).getReason()) ?...exchange, errorResult); } } 可以看到调用者实现了Spring的ErrorWebExceptionHandler类,也就是说这个警报的实际调用者是用Spring内置的web错误处理器

    127108

    关于是否需要使用获取错误代码接口的思考

    常用的编程方式对于错误码的最多方式是通过返回值。通过一系列的示例来引发示例3的返回值接口思考。 常用获取错误代码方式 1. 通过返回 ErrorCode获得错误码。...通过返回一个 string获得错误码字符串。 string exec(); 3. 还有一些方式是通过额外的 getErrorCode和 errorCode这类的名字接口获取错误代码。...使用参数引用/指针获取 void exec(ErrorCode &errorCode); 什么情况下使用额外的接口获取错误代码方式比较好?...一般使用在上面的第三种方式中; 当需要的返回值具有其他功能; 当 list为空时并不能确定是内部返回的结果为空还是由于错误而返回的空值问题; 有人会问,我可以在参数传入来获取。...比如: list exec(ErrorCode &errorCode); 的确这样可以解决问题,但是有些时候我们并不需要知道具体的错误,也就不必传入额外的 errorCode的引用。

    94310
    领券