首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >前端和后端之间的错误处理

前端和后端之间的错误处理
EN

Stack Overflow用户
提问于 2022-03-02 09:49:53
回答 1查看 1.3K关注 0票数 0

在工作中,我们使用java spring后端和vue前端构建了一个web应用程序。目前,我们使用2或3个http响应代码在前端和后端之间传递错误。如果使用错误的参数调用和终结点,您将得到一个BAD_REQUEST。如果在后端(与参数无关)抛出一些异常,后端将返回一个INTERNAL_SERVER_ERROR,如果您传递一些不在数据库中的in,后端将返回一个NOT_FOUND。

此方法存在多个问题:

  • 我们没有错误情况下的结构,可以用来将信息传递给用户(前端)
  • ,我们希望向用户指出问题,这些问题不能被HTTP代码分类。例如,如果外部服务不可用,我们希望将服务名称传递给前端。但我不知道"SERVICE_UNAVAILABLE“是否适合这里.

我已经找到了:https://www.baeldung.com/spring-response-status-exception,我们可以使用message字段传递有关错误的详细信息(消息字段中的特定错误json )。这是个好主意吗

意见?

T

EN

回答 1

Stack Overflow用户

发布于 2022-03-02 11:40:18

当然,您可以在这个字段中传递信息,但是可以使用ResponseStatusException。取决于前端需要多少信息(例如,如果它只是向用户显示一条用户友好的消息),这可能就足够满足您的需要了。

另一种方法,如果您想在响应中使用自定义对象(尤指。每个异常/响应代码),使用@ControllerAdvice和扩展ResponseEntityExceptionHandler

例如,假设您有一个自定义异常ExternalServiceUnavailableException,其中包含一些可以从中检索的底层ServiceInformation。然后你就可以做一些事情

代码语言:javascript
运行
复制
public class ServiceInformation {
    private final String name;
    private final String status;
    private final String statusMessage;

//snip
}

@ControllerAdvice
public class CustomResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler({ ExternalServiceUnavailableException.class })
    public ResponseEntity<Object> handleExternalServiceUnavailable(ExternalServiceUnavailableException ex, WebRequest request) {

        final ServiceInformation si = ex.getServiceInformation();
        return ResponseEntity
            .status(503) // or whatever code you want
            .body(si); // or map to some other object/format
        // or use the constructor to supply headers etc.
    }
}

当您抛出一个ExternalServiceUnavailableException时,会产生一个响应体,如

代码语言:javascript
运行
复制
{
    "name": "my-external-service",
    "status": "timeout",
    "statusMessage": "Service timed out after 30 seconds"
}

在下面的文章中可以找到一个更完整的示例,其中对每个后果异常和默认处理程序都使用相同的自定义错误对象。

https://www.baeldung.com/exception-handling-for-rest-with-spring

这使得前端更容易解释(就像您建议的方法一样),因为只有一种格式可供期待和解析,但您可以在每个异常中自由地返回不同的响应形状。

编辑:值得记住的是,还有响应代码502 (坏网关)和504 (网关超时),它们可以用来指示外部服务不可用或超时。如果这些都是适当的,您只需使用适当的ResponseStatusExceptions,并设置一条消息来包含服务名称(或其他信息)。如前所述,这取决于您需要/希望正面接收什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71320594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档