Kotlin은 checked exception을 지원하지 않습니다. 잠재적으로 복구 가능한 예외만 처리하도록 선택할 수 있으므로 오류 처리가 간소화되고 효율화됩니다. 가능한 모든 예외를 명시적으로 처리할 필요가 없으므로 코드가 덜 복잡해지고 결과적으로 기본 목적에 더 집중할 수 있습니다.
복구 가능한 실패는 개발자가 해결할 수 있는 문제입니다.
예를 들어 호출에 사용된 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
를 처리할 때는 code
및 message
필드를 확인하여 무엇이 잘못되었는지 알아봅니다.
처리되지 않은 예외가 있으면 앱이 비정상 종료됩니다.
다음 표에는 발생할 수 있는 HomeException
코드의 의미가 나와 있습니다.
코드 | 의미 |
---|---|
ABORTED
| 작업이 취소되었습니다. 대개 시퀀서 확인 실패, 트랜잭션 취소 등의 동시 실행 문제가 원인입니다. |
ALREADY_EXISTS |
클라이언트에서 만들려고 시도한 항목(예: 파일 또는 디렉터리)이 이미 존재합니다. |
API_NOT_CONNECTED |
클라이언트가 연결에 실패한 API에서 메서드를 호출하려고 시도했습니다. 이 오류는 기기가 오프라인 상태이거나 클라이언트가 호출하려고 한 API를 지원하지 않는 경우에 발생할 수 있습니다. |
CANCELLED |
작업이 취소되었습니다. 대개 호출자에 의해 취소됩니다. |
DATA_LOSS |
복구할 수 없는 데이터 손실이나 손상이 발생했습니다. |
DEADLINE_EXCEEDED |
작업을 완료하기 전에 기한이 지났습니다. 시스템의 상태를 변경하는 작업의 경우 작업이 정상적으로 완료되어도 이 오류가 반환될 수 있습니다. |
FAILED_PRECONDITION |
시스템이 작업 실행에 필요한 상태가 아니기 때문에 작업이 거부되었습니다. 예를 들어 이미 중지된 오븐에서 OvenCavityOperationalStateTrait 의 stop 명령어가 호출된 경우나 디렉토리가 아닌 항목에서 rmdir 작업을 실행하려고 한 경우 이 메시지가 표시될 수 있습니다. |
INTERNAL |
내부 오류가 발생했습니다. 이는 기본 시스템에서 예상하는 일부 불변량이 손상되었음을 의미합니다. 이 오류 코드는 심각한 오류를 위해 예약되어 있습니다. |
INVALID_ARGUMENT |
클라이언트가 예상 값 범위를 벗어나는 인수를 제공했습니다. |
NOT_FOUND |
파일 또는 디렉터리와 같은 요청한 항목을 찾을 수 없습니다.
단계적 기능 출시, 문서화되지 않은 허용 목록 등으로 인해 전체 사용자 클래스에게 요청이 거부된 경우에는 NOT_FOUND 를 사용할 수 있습니다.
사용자별 액세스 제어 등으로 인해 사용자 클래스에 속하는 일부 사용자에게 요청이 거부된 경우에는 PERMISSION_DENIED 를 사용해야 합니다. |
OUT_OF_RANGE |
end-of-file 을 지나서 탐색하거나 읽는 등 유효한 범위를 넘어서 작업을 시도했습니다. INVALID_ARGUMENT 와 달리 이 오류는 시스템 상태가 변경되면 문제가 해결될 수 있음을 나타냅니다. |
PERMISSION_DENIED |
호출자에게 지정한 작업을 실행할 권한이 없습니다. 일부 리소스가 소진되어 거부된 경우에는 PERMISSION_DENIED 를 사용해서는 안 됩니다. 대신 이러한 오류에는 RESOURCE_EXHAUSTED 를 사용하세요.
호출자를 식별할 수 없는 경우에는 PERMISSION_DENIED 가 아닌 UNAUTHENTICATED 를 사용해야 합니다.
이 오류 코드는 요청이 유효하다거나 요청된 항목이 존재한다거나 다른 전제 조건이 충족되었음을 의미하지 않습니다. |
RESOURCE_EXHAUSTED |
일부 리소스가 소진되었습니다. 사용자당 할당량에 도달했거나 전체 파일 시스템의 공간이 부족하기 때문일 수 있습니다.
예를 들어 DispenseTrait 의 dispense 명령어가 반려동물 먹이 공급기 기기에서 호출되었지만 장치에 더 이상 음식이 남아 있지 않으면 이 오류가 발생할 수 있습니다. |
SDK_INITIALIZATION_MISSING_INFO |
필수 정보가 모두 포함되지 않은 상태로 SDK가 초기화되었습니다.
예를 들어 클라이언트가 특정 특성 ID의 TraitFactory 를 가져오려고 시도했지만 SDK를 초기화할 때 특성이 포함되지 않은 경우 이 오류가 발생합니다. Android에서 홈 초기화를 참고하세요. |
UNAUTHENTICATED |
호출자를 식별할 수 없거나 요청에 유효한 사용자 인증 정보가 없습니다. |
UNAVAILABLE |
서비스를 사용할 수 없습니다. 일시적인 상태일 가능성이 높으며, 잠시 시간을 두고 다시 시도하면 해결될 수 있습니다. 멱등성이 없는 작업을 재시도하는 것이 항상 안전한 것은 아닙니다. |
UNIMPLEMENTED |
요청한 작업이 이 서비스에서 구현되지 않았거나 지원되지 않거나 사용 설정되지 않았습니다. |
UNKNOWN |
알 수 없는 오류입니다. UNKNOWN 는 다른 오류 코드를 사용하여 분류할 수 없는 오류 조건이 발생할 때 표시됩니다.
예를 들어 외부 API에서 수신한 상태 값에 근본 원인에 관한 정보가 충분하지 않은 경우 이 오류가 반환될 수 있습니다. |