处理 API 错误与网络错误

Posted

技术标签:

【中文标题】处理 API 错误与网络错误【英文标题】:Handling API errors vs Network errors 【发布时间】:2013-10-15 19:54:43 【问题描述】:

我正在构建一个 SDK。

基本上,开发人员会传入一个错误处理函数,该函数将在调用 API 时发生错误。

对于 API 错误(或 API 返回的错误),我使用域 ExampleAPPDomain 创建一个 NSError。 ApI 错误具有不同的 userInfo 结构(例如,我在用户信息中添加了一个“类别”键)。

但有时错误是 nsurlconnection 错误...我也将该错误传递给错误处理程序。

所以我打电话:

errorHandler(error)

有时传递给 errorHandler 函数的 NSError 错误是 API 错误,有时是 NSUrlConnection 类型错误(如网络错误)。

我怎样才能最好地以不同的方式处理这些错误? 例如,在错误处理程序代码中,开发人员必须检查错误的域以查看它是什么类型(NSURLDomain 与 ExampleAPPDomain)并相应地处理它。这是区分两种错误的唯一方法。

对于此类问题,处理 APP 错误与 NSUrlConnection 连接错误的标准方法是什么?

【问题讨论】:

【参考方案1】:

为什么不总是给他们 ExampleAppDomain 作为错误的域。这样就没有混乱了。大多数标准库都这样做 - 封装所有错误。本质上,当您收到错误时,您需要将其与您的域包装在 NSError 中。您可以检查响应的 NSURLConnectionDelegate 的可接受的 statusCode 和内容。此外,与其自己处理所有网络代码,不如使用像 AFNetworking 这样的标准库?

这是一个代码,但您必须根据 XML/JSON 检查可接受的代码/内容。以下是 AFNetworking 的摘录。

NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
[userInfo setValue:self.responseString forKey:NSLocalizedRecoverySuggestionErrorKey];
[userInfo setValue:[self.request URL] forKey:NSURLErrorFailingURLErrorKey];
[userInfo setValue:self.request forKey:ExampleAppDomainFailingURLRequestErrorKey];
[userInfo setValue:self.response forKey:ExampleAppDomainOperationFailingURLResponseErrorKey];


NSError *error = [[NSError alloc] initWithDomain:ExampleAppDomain code:NSURLErrorBadServerResponse userInfo:userInfo];

查看 NSURLError.h 文件了解更多错误信息。

【讨论】:

我应该如何将错误从 NSUrlDomain 转换为这种新格式?我只是复制本地化的描述和错误代码吗?或者我应该将 nsurldomain 错误作为基础错误参数存储在创建的新 ExampleAppDomain 错误的用户信息中...

以上是关于处理 API 错误与网络错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 时可能出现未处理的 Promise 拒绝、网络错误

WebAPI错误处理:如何简化调试

Retrofit2 和 OkHttp3 仅在发生错误时使用缓存,例如网络错误或达到配额限制

Vue 3 可重用错误处理和 handleSubmit 在可重用“useForm”函数中使用组合 api

我如何编写处理来自 API 的响应/错误的 golang 中间件?

Python20期课堂总结-20180127day8-异常处理与网络编程