错误处理
当您执行以下操作时:GraphQL 操作可能出现两种高级错误类型:
- 网络错误: 由于与您的 GraphQL 服务器 通信时发生错误,未收到GraphQL响应。这可能是因为SSL错误、因应用离线而导致的套接字错误,或500或任何其他HTTP错误。当发生网络错误时,不返回任何数据。
- GraphQL错误: 收到GraphQL响应,并包含非空
errors
字段。这意味着服务器无法完全处理 查询。如果服务器能够处理查询的一部分,则响应可能包括部分数据。
网络错误
执行一个操作的结果是 Swift 的 Result
。网络错误会导致操作结果为 .failure(Error)
。
您可以使用 do/catch
块并调用 try result.get()
或通过开关 result
来处理网络错误。
apollo.fetch(query: HeroNameQuery()) { result indo {let data = try result.get().data...} catch {// Network errorprint(error)}}
apollo.fetch(query: HeroNameQuery()) { result inswitch result {case .success(let response):...case .failure(let error):// Network errorprint(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?.person
是nil
。 在最坏的情况下,如果其他一切都是不可空的,GraphQLResult.data
可能是nil
。
Apollo iOS 为您提供访问 数据
和 错误
在 GraphQLResult
类中的
apollo.fetch(query: HeroNameQuery()) { result inswitch result {case .success(let response):if let errors = response.errors {// GraphQL errors}let film = response.data?.film // Existslet person = response.data?.person // nilcase .failure(let error):// Network errorprint(error)}}
GraphQL 错误以类型安全的方式返回为 GraphQLError
值。这些值从响应中解析,具体解析方式请参考 GraphQL 规范中关于响应格式错误的章节。