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代码的含义:
| 代码 | 含义 |
|---|---|
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 收到的状态值缺少有关根本原因的足够信息时,可能会返回此错误。 |