Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RESTAPI处理错误的最佳实践_Rest_Exception_Design Patterns_Error Handling - Fatal编程技术网

RESTAPI处理错误的最佳实践

RESTAPI处理错误的最佳实践,rest,exception,design-patterns,error-handling,Rest,Exception,Design Patterns,Error Handling,我想知道在RESTAPI后端内部应该如何处理错误。假设用户提供了不完整的请求负载、验证失败或寻找不存在的内容。我们想退回400或404箱 在一些框架中(只有我有经验的框架),我们通过抛出异常(NestJS、Spring等)来实现这一点。但在运行过程中,操作方法(验证、访问数据库)返回的错误可以指示错误(如果err!=nil),我们可以将错误提升到控制器级别,并对其进行不同的处理(返回一些特定的状态、错误消息等) 我的问题是,哪种方式(或者如果有其他首选方式)是处理后端错误的最佳方式?问题是抛出异

我想知道在RESTAPI后端内部应该如何处理错误。假设用户提供了不完整的请求负载、验证失败或寻找不存在的内容。我们想退回400或404箱

在一些框架中(只有我有经验的框架),我们通过抛出异常(NestJS、Spring等)来实现这一点。但在运行过程中,操作方法(验证、访问数据库)返回的
错误可以指示错误(
如果err!=nil
),我们可以将
错误提升到控制器级别,并对其进行不同的处理(返回一些特定的状态、错误消息等)

我的问题是,哪种方式(或者如果有其他首选方式)是处理后端错误的最佳方式?问题是抛出异常将显示在任何日志监控工具上,并将显示应用程序有如此多的错误,即使大多数可能是4XX错误(我们可以过滤日志以确定找到50X错误),并且使用
errors
return对象可能会很麻烦,无法为我们拥有的每个验证函数冒泡。如果有任何存储库示例或文章可以解释类似的主题,我会很高兴


谢谢

我看到抛出异常的一个问题是,我们可能会向用户发出一些内部错误,这可能对他们没有好处,也会暴露我们的实现

对于我们拥有的每个验证函数,使用errors返回对象可能会很麻烦

是的,传播错误可能很麻烦,但我认为最好将所需的错误从被调用函数传播到被调用方,并让被调用方决定他们想要做什么。对于rest调用,我认为将错误从DB层传播到服务层再传播到rest层是可以的

此外,我们还可以将rest层的错误封装到标准响应消息中

{
    "type": "/errors/incorrect-user-pass",
    "title": "Incorrect username or password.",
    "status": 401,
    "detail": "Authentication failed due to incorrect username or password.",
    "instance": "/login/log/abc123"
}
我们可以在调用Http.Handle()时调用包装器函数来处理错误。这包含示例函数
ServeHTTP()


Credit:函数取自
serveHTTP
,响应对象示例取自
https://www.baeldung.com/

谢谢您的回答和解释!我同意你的观点,尤其是错误响应信息的格式。但在我看来,通过不同的层传播错误对象,它会添加更多的代码(要检查),并产生详细而详细的代码。对于Go和其他可以返回多个值的语言(
returnresult,err
)会更好,但是对于Java和TS这样的语言,我们需要一个通用的包装器,所有东西都将使用这个包装器,甚至更多的代码(
Promise
)。我正在考虑第三种方法,即抛出异常,但在控制器上捕获它(或类似,请参阅下面的NestJS异常过滤器)级别,处理4XX或5XX错误,将其转换并包装为常见错误格式(如您的示例所示),并返回响应。我正在使用NestJS,我可以利用它来实现此目的。您认为这种方法如何?是否有类似的模式?我也喜欢在控制器级别处理它的第三种方法,我已经使用java实现了类似的方法。但我在go中找不到类似的方法。