在 iOS 上处理错误

Swift 提供内置支持,可在运行时抛出和捕获可恢复的错误。例如,如果代码中的某项操作失败或无效,API 会抛出 HomeError 错误。这样,您只需关注可恢复的错误,从而简化和精简错误处理流程。然后,您可以提供一些选项,例如让用户重试或显示“未找到结构”等消息。此外,由于您不必明确处理每种可能的异常,因此代码会更加简洁,从而能够更专注于其主要用途。

以下示例展示了如何处理可恢复的失败:

    let light1 = lightDevices.first
    if let light = light1 {
    do {
      try await structure.move(device: light, to: room)
    } catch let error as HomeError {
      // Code for handling the exception
    }

下表提供了您可能会遇到的 HomeError代码的含义:

表: HomeError 代码
代码 含义
aborted 操作已中止。这通常会在出现 并发问题(例如序列检查失败或事务 中止)时显示。
alreadyExists 您尝试创建的资源或实体已存在。 例如,这可能是恒温器的命名时间表。
cancelled 操作已取消(通常是被调用者取消)。
dataLoss 数据丢失或损坏且不可恢复。
deadlineExceeded 在操作完成之前截止期限已过。对于更改系统状态的操作 ,即使操作已成功完成,也可能会返回此错误 。例如,服务器的 成功响应延迟时间过长,截止期限已过。
failedPrecondition 操作被拒绝,因为系统未处于执行该操作所需的状态 。例如,如果您对已停止的烤箱调用 stop ,则可能会收到此消息。
internal 内部错误。这意味着底层系统所期望的一些不变量已损坏。此错误代码保留用于 严重错误。
invalidArgument 客户端指定了无效参数。 请注意,这与 `failedPrecondition` 不同。无论系统状态如何,`invalidArgument` 都会指出有问题的参数(例如文件名格式错误)。
notFound 您指定的实体或资源无法找到。例如,在媒体播放器设备上调用 play 时指定不存在的曲目 ID。
outOfRange 根据当前系统 状态,某个参数超出了有效范围。当值在 API 调用可能接受的值范围内 但在当前上下文中没有意义时 就会出现此消息。
permissionDenied 您无权执行指定的操作。不应将此 错误代码解读为表示请求在 其他方面有效。
resourceExhausted 某些资源已用尽。例如,当您在宠物喂食器设备上调用 dispense(item:amount:unit:presetName:) 且设备中没有剩余食物时,可能会抛出此错误。

这还可能是由于超出了 Home API 项目配额所致。如需了解详情,请参阅配额管理
unauthenticated 无法识别调用者,或者请求没有有效的 身份验证凭据。
unavailable 服务不可用,这很可能是一种暂时情况,可以通过退避重试来纠正。请注意, 重试执行非幂等操作并非总是安全的。
unimplemented 请求的操作在此服务中未实现、不受支持或未启用 。
unknown 未知错误。一般来说,当出现无法使用任何其他错误代码进行分类的错误情况时,就会显示 unknown。例如,当从外部 API 收到的状态值缺少有关根本原因的足够信息时,可能会返回此错误。