加入我们,从10月8日至10日在纽约市,学习有关 GraphQL 联邦和 API 平台工程的最新技巧、趋势和新闻。加入我们,2024年 NYC GraphQL 峰会
文档
免费开始

错误处理


当您执行以下操作时: 操作可能出现两种高级错误类型:

网络错误

执行一个操作的结果是 Swift 的 Result。网络错误会导致操作结果为 .failure(Error)

您可以使用 do/catch 块并调用 try result.get() 或通过开关 result 来处理网络错误。

apollo.fetch(query: HeroNameQuery()) { result in
do {
let data = try result.get().data
...
} catch {
// Network error
print(error)
}
}
apollo.fetch(query: HeroNameQuery()) { result in
switch result {
case .success(let response):
...
case .failure(let error):
// Network error
print(error)
}
}

原因

网络错误的可能原因包括(但不限于)

  • 应用离线或没有访问网络。
  • 发生 DNS 错误,无法查找主机。
  • 发生 SSL 错误(例如,服务器证书不受信任)。
  • 连接已关闭。
  • 服务器响应了非成功的 HTTP 状态码。
  • 服务器没有返回有效的 JSON。
  • 响应的 JSON 不满足模式且无法解析。
  • 请求指定为 .returnCacheDataDontFetch 但数据未缓存。

检查异常以获取有关实际错误的更多详细信息。

GraphQL 错误

由于带有 GraphQL 错误的响应可能仍然包含数据,因此不会返回 .failure 结果。相反,它们返回一个 .success 结果,其中包含一个 GraphQLResult,其中 errors 字段包含发生的错误。

例如,以下 查询 使用无效的 id 来查找 Person

query FilmAndPersonQuery {
film(id: "ZmlsbXM6M") {
title
}
person(id: "badId") {
name
}
}

服务器将发送以下响应

{
"data": {
"film": {
"title": "A New Hope"
},
"person": null
},
"errors": [
{
"message": "No entry in local cache for https://swapi.dev/api/people/m�H/",
"locations": [
{
"line": 35,
"column": 3
}
],
"path": [
"person"
]
}
]
}

请注意,尽管存在错误,查询query成功返回了电影标题:新希望. 在一般情况下,在执行操作期间发生任何错误,将向上层传递到下一个可空field。 在这个例子中data?.personnil。 在最坏的情况下,如果其他一切都是不可空的,GraphQLResult.data可能是nil

为您提供访问 数据错误GraphQLResult 类中的

apollo.fetch(query: HeroNameQuery()) { result in
switch result {
case .success(let response):
if let errors = response.errors {
// GraphQL errors
}
let film = response.data?.film // Exists
let person = response.data?.person // nil
case .failure(let error):
// Network error
print(error)
}
}

GraphQL 错误以类型安全的方式返回为 GraphQLError 值。这些值从响应中解析,具体解析方式请参考 GraphQL 规范中关于响应格式错误的章节

上一页
操作参数
下一页
类型条件
评级文章评级在GitHub上编辑编辑论坛Discord

©2024Apache Graph Inc.,乃Apollo GraphQL股份有限公司。

隐私政策

公司