Android의 오류 처리

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을 처리할 때는 error.code error.message 필드를 확인하여 무엇이 잘못되었는지 알아보세요. 하위 오류 코드 도 있을 수 있으므로 getSubErrorCodes() 메서드를 호출하고 결과를 확인하세요.

처리되지 않은 예외가 있으면 앱이 비정상 종료됩니다.

다음 표에서는 발생할 수 있는 HomeException 코드의 의미를 제공합니다.

표: HomeException 코드
코드 의미
ABORTED 작업이 취소되었습니다. 대개 시퀀서 확인 실패, 트랜잭션 취소 등의 동시 실행 문제 가 원인입니다.
ALREADY_EXISTS 클라이언트에서 만들려고 시도한 항목(예: 파일 또는 디렉터리)이 이미 존재합니다.
API_NOT_CONNECTED 클라이언트가 연결하지 못한 API에서 메서드를 호출하려고 시도했습니다. 이는 기기가 오프라인 상태이거나 클라이언트가 호출하려고 시도한 API를 지원하지 않는 경우에 발생할 수 있습니다.
CANCELLED 작업이 취소되었습니다. 대개 호출자에 의해 취소됩니다.
COMMAND_FAILED 명령어를 실행하지 못했습니다. 자세한 내용은 하위 오류 코드를 확인하세요.
CURSOR_WINDOW_NOT_SUPPORTED CursorWindow를 사용하는 메서드가 호출되었지만 현재 컨텍스트에서 CursorWindow가 사용 설정되지 않았거나 지원되지 않습니다.
DATA_LOSS 복구할 수 없는 데이터 손실 또는 손상이 발생했습니다.
DEADLINE_EXCEEDED 작업을 완료하기 전에 기한이 지났습니다. 시스템의 상태를 변경하는 작업의 경우 작업이 정상적으로 완료되어도 이 오류가 반환될 수 있습니다.
DECOMMISSIONING_INELIGIBLE 기기가 폐기 대상이 아니므로 폐기하지 못했습니다.
FAILED_PRECONDITION 시스템이 작업 실행에 필요한 상태가 아니기 때문에 작업이 거부되었습니다. 예를 들어 이미 중지된 오븐에서 OvenCavityOperationalStateTraitstop 명령어가 호출되면 이 메시지가 표시될 수 있습니다.
INTERNAL 내부 오류가 발생했습니다. 내부 시스템에서 예상하는 불변 항목에 문제가 있는 경우입니다. 이 오류 코드는 심각한 오류를 위해 예약되어 있습니다.
INVALID_ARGUMENT 클라이언트가 예상 값 범위를 벗어나는 인수를 제공했습니다.
INVALID_DATA_HOLDER 데이터 홀더가 잘못되었습니다.
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 일부 리소스가 소진되었습니다. 사용자당 할당량 에 도달했거나 전체 파일 시스템의 저장용량이 부족하기 때문일 수 있습니다. 예를 들어 반려동물 급식기 기기에서 dispense 명령어가 호출되었지만 기기에 더 이상 음식이 남아 있지 않으면 이 오류가 발생할 수 있습니다.DispenseTrait

이는 Home API 프로젝트 할당량을 초과했기 때문일 수도 있습니다. 자세한 내용은 할당량 관리를 참고하세요.
SDK_INITIALIZATION_MISSING_INFO 필요한 정보가 모두 포함되지 않은 상태로 SDK가 초기화되었습니다. 예를 들어 클라이언트가 특정 특성 ID의 TraitFactory를 가져오려고 시도했지만 SDK를 초기화할 때 특성이 포함되지 않은 경우 이 오류가 발생합니다. Android에서 홈 초기화를 참고하세요.
UNAUTHENTICATED 호출자를 식별할 수 없거나 요청에 유효한 사용자 인증 정보가 없습니다.
UNAVAILABLE 서비스를 사용할 수 없습니다. 일시적인 상태일 가능성이 높으며, 잠시 시간을 두고 다시 시도하면 해결될 수 있습니다. 멱등성이 없는 작업을 재시도하는 것이 항상 안전한 것은 아닙니다.
UNIMPLEMENTED 요청된 작업이 이 서비스에 구현되어 있지 않거나 지원되지 않거나 사용 설정되어 있지 않습니다.
UNKNOWN 알 수 없는 오류입니다. UNKNOWN은 다른 오류 코드를 사용하여 분류할 수 없는 오류 조건 이 발생할 때 표시됩니다. 예를 들어 외부 API에서 수신한 상태 값에 근본 원인에 관한 충분한 정보가 없는 경우 이 오류가 반환될 수 있습니다.
WRITE_FAILED 쓰기를 실행하지 못했습니다. 자세한 내용은 하위 오류 코드를 확인하세요.