错误处理

Kotlin 不支持受检异常。这样可以简化和简化错误处理,因为您可以选择仅处理可能可恢复的异常。由于您无需明确处理每种可能的异常,因此代码会更加简洁,从而更专注于其主要用途。

可恢复的失败是指开发者可以自行解决的问题。例如,如果调用中使用的 ID 无效,API 会抛出包含 invalid data 消息的 HomeException。然后,应用开发者可以选择从其缓存中移除该 ID,或向用户显示“未找到结构”等消息。

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

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

Home API 中的任何方法都可能会抛出 HomeException,因此我们建议您使用 try-catch 块捕获所有调用的 HomeException

处理 HomeException 时,请检查其 codemessage 字段,了解问题所在。

任何未处理的异常都会导致应用崩溃。

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

表:HomeException 代码
代码 含义
ABORTED 操作已中止。当存在序列检查失败或事务中止等并发问题时,通常会出现此错误。
ALREADY_EXISTS 您尝试创建的资源或实体已存在。 例如,这可以是温控器的命名时间表。
API_NOT_CONNECTED 客户端尝试调用未能连接的 API 中的方法。如果设备处于离线状态或不支持您尝试调用的 API,就可能会出现这种情况。
CANCELLED 操作已取消(通常是被调用者取消)。
DATA_LOSS 数据丢失或损坏且不可恢复。
DEADLINE_EXCEEDED 期限已到,但操作尚未完成。对于更改系统状态的操作,即使操作已成功完成,也可能会返回此错误。
FAILED_PRECONDITION 操作被拒绝,因为系统未处于执行该操作所需的状态。例如,如果您对已停止的烤箱调用了 stop,则可能会收到此消息。
INTERNAL 内部错误。这意味着底层系统所期望的一些不变量已损坏。此错误代码保留用于严重错误。
INVALID_ARGUMENT 您提供的参数超出了预期的值范围。
NOT_FOUND 您指定的实体或资源无法找到。例如,在媒体播放器设备上调用 activateAudioTrack 时指定不存在的曲目 ID。
OUT_OF_RANGE 根据当前系统状态,某个参数超出了有效范围。如果值在 API 调用可能接受的值范围内,但在当前上下文中没有意义,则会出现此消息。
PERMISSION_DENIED 您无权执行指定的操作。此错误代码不应被解读为请求在其他方面有效。
RESOURCE_EXHAUSTED 某个资源已耗尽。例如,当用户对宠物喂食器设备调用 dispense 时,如果设备中没有剩余食物,便可能会抛出此异常。
SDK_INITIALIZATION_MISSING_INFO SDK 未完全初始化。例如,如果您尝试为未注册的特征获取 TraitFactory,就会收到此消息。请参阅初始化
UNAUTHENTICATED 无法识别调用方,或者请求没有有效的身份验证凭据。
UNAVAILABLE 该服务不可用。这很可能是一种暂时情况,可以通过退避重试来纠正。请注意,重试执行非幂等操作并非总是安全的。
UNIMPLEMENTED 请求的操作在此服务中未实现、不受支持或未启用。
UNKNOWN 未知错误。一般来说,当发生无法使用任何其他错误代码进行分类的错误情况时,就会显示 UNKNOWN。例如,当从外部 API 接收到的状态值缺少有关根本原因的足够信息时,便会返回该错误。