首页 > 解决方案 > 如何处理来自 REST 的多种类型的异常

问题描述

我有一个可以引发多种异常的 REST 资源。为了在发生异常时检索漂亮的响应,我执行了以下操作:

@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleError(Exception ae) {
    return new ResponseEntity<String>(ae.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}

但是从clinet方面我无法识别抛出了什么类型的异常!我有一些带有预期异常的 Junit,并且测试用例因此在不同的模式下失败。

我可以为错误添加一个新类,其中将包含异常名称:ae.getClass().getSimpleName(),以及消息并将其作为响应返回。

有没有更清洁的方法?

标签: restexception

解决方案


要处理多种异常类型,您可以查看Spring MVC 在 ResponseEntityExceptionHandler类中的作用。它处理多个Exceptions 并使用 . 检查它们的类型instanceof


但是从客户端我无法识别抛出了什么类型的异常!

我可以为其添加一个新类,该类Error将包含异常名称:ae.getClass().getSimpleName()和消息并将其作为响应返回。

您应该避免将此信息泄露给客户。如果重构代码并重命名异常类会怎样?您将破坏客户端代码。

相反,您应该将异常转换为客户端可以解析的内容(当然,还要正确记录它)。

例如,考虑一个OutOfCreditException(为此示例而编造的)来表示客户的帐户没有足够的信用来进行购买。它可以转换为以下有效负载,客户端可以轻松解析该有效负载:

{
  "error": "out-of-credit",
  "title": "You do not have enough credit",
  "details": "Your current balance is €10, but the items cost €50",
  "balance": 10,
  "currency": "EUR"
}

对于报告基于 HTTP 的 API 中的问题,还可以考虑查看 [RFC 7807][4]:它定义了一种简单的 JSON 文档格式,用于表示问题以及application/problem+json媒体类型。


推荐阅读