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
를 처리할 때는 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에서 수신한 상태 값에 근본 원인에 관한 충분한 정보가 없는 경우 이 오류가 반환될 수 있습니다. |