Android의 오류 처리

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를 처리할 때는 codemessage 필드를 확인하여 무엇이 잘못되었는지 알아봅니다.

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

다음 표에는 발생할 수 있는 HomeException 코드의 의미가 나와 있습니다.

표: HomeException codes
코드 의미
ABORTED 작업이 취소되었습니다. 대개 시퀀서 확인 실패, 트랜잭션 취소 등의 동시 실행 문제가 원인입니다.
ALREADY_EXISTS 클라이언트에서 만들려고 시도한 항목(예: 파일 또는 디렉터리)이 이미 존재합니다.
API_NOT_CONNECTED 클라이언트가 연결에 실패한 API에서 메서드를 호출하려고 시도했습니다. 이 오류는 기기가 오프라인 상태이거나 클라이언트가 호출하려고 한 API를 지원하지 않는 경우에 발생할 수 있습니다.
CANCELLED 작업이 취소되었습니다. 대개 호출자에 의해 취소됩니다.
DATA_LOSS 복구할 수 없는 데이터 손실이나 손상이 발생했습니다.
DEADLINE_EXCEEDED 작업을 완료하기 전에 기한이 지났습니다. 시스템의 상태를 변경하는 작업의 경우 작업이 정상적으로 완료되어도 이 오류가 반환될 수 있습니다.
FAILED_PRECONDITION 시스템이 작업 실행에 필요한 상태가 아니기 때문에 작업이 거부되었습니다. 예를 들어 이미 중지된 오븐에서 OvenCavityOperationalStateTraitstop 명령어가 호출된 경우나 디렉토리가 아닌 항목에서 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 일부 리소스가 소진되었습니다. 사용자당 할당량에 도달했거나 전체 파일 시스템의 공간이 부족하기 때문일 수 있습니다. 예를 들어 DispenseTraitdispense 명령어가 반려동물 먹이 공급기 기기에서 호출되었지만 장치에 더 이상 음식이 남아 있지 않으면 이 오류가 발생할 수 있습니다.
SDK_INITIALIZATION_MISSING_INFO 필수 정보가 모두 포함되지 않은 상태로 SDK가 초기화되었습니다. 예를 들어 클라이언트가 특정 특성 ID의 TraitFactory를 가져오려고 시도했지만 SDK를 초기화할 때 특성이 포함되지 않은 경우 이 오류가 발생합니다. Android에서 홈 초기화를 참고하세요.
UNAUTHENTICATED 호출자를 식별할 수 없거나 요청에 유효한 사용자 인증 정보가 없습니다.
UNAVAILABLE 서비스를 사용할 수 없습니다. 일시적인 상태일 가능성이 높으며, 잠시 시간을 두고 다시 시도하면 해결될 수 있습니다. 멱등성이 없는 작업을 재시도하는 것이 항상 안전한 것은 아닙니다.
UNIMPLEMENTED 요청한 작업이 이 서비스에서 구현되지 않았거나 지원되지 않거나 사용 설정되지 않았습니다.
UNKNOWN 알 수 없는 오류입니다. UNKNOWN는 다른 오류 코드를 사용하여 분류할 수 없는 오류 조건이 발생할 때 표시됩니다. 예를 들어 외부 API에서 수신한 상태 값에 근본 원인에 관한 정보가 충분하지 않은 경우 이 오류가 반환될 수 있습니다.