处理 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 拒绝、网络错误
Retrofit2 和 OkHttp3 仅在发生错误时使用缓存,例如网络错误或达到配额限制
Vue 3 可重用错误处理和 handleSubmit 在可重用“useForm”函数中使用组合 api