> ## Documentation Index
> Fetch the complete documentation index at: https://guide.daro.so/llms.txt
> Use this file to discover all available pages before exploring further.

# 에러 처리

> DARO Android SDK의 통합 에러 코드(DaroErrorCode)와 DaroError 객체로 광고 로드 실패를 일관되게 처리하는 방법을 안내합니다.

## 개요

DARO SDK는 광고 로드가 실패하면 통합 에러 객체 `DaroError`를 전달합니다. 모든 오류는 동일한 `DaroErrorCode` 체계로 변환되므로, 퍼블리셔는 하나의 분기 로직으로 에러를 처리할 수 있습니다.

<Info>
  통합 에러 코드는 daro-a `1.6.0` / daro-m `1.3.14` 버전부터 제공됩니다.
</Info>

***

## DaroError 객체

로드 실패 콜백은 `DaroError` 객체를 전달합니다. 주요 프로퍼티는 다음과 같습니다.

| 프로퍼티            | 타입              | 설명                                   |
| --------------- | --------------- | ------------------------------------ |
| `errorCode`     | `Int`           | 통합 에러 코드의 정수 값입니다.                   |
| `errorCodeName` | `DaroErrorCode` | 통합 에러 코드의 이름(enum)입니다. 분기 처리에 사용하세요. |
| `errorMessage`  | `String`        | 오류 메시지입니다. 로깅·디버깅에 활용하세요.            |
| `latency`       | `Int`           | 광고 요청에 소요된 시간(ms)입니다.                |

***

## 통합 에러 코드

`DaroErrorCode`는 아래 코드로 구성됩니다. 분기 처리는 정수 값이 아닌 `errorCodeName`(enum)으로 하는 것을 권장합니다.

### 초기화·설정 오류

| 코드   | 이름                      | 발생 조건                          | 권장 대응                               |
| ---- | ----------------------- | ------------------------------ | ----------------------------------- |
| `-1` | `UNSPECIFIED`           | 분류되지 않은 일반 오류입니다.              | `errorMessage`를 확인하고 잠시 후 다시 요청하세요. |
| `-2` | `NOT_INITIALIZED`       | SDK가 초기화되지 않은 상태에서 광고를 요청했습니다. | SDK 초기화가 완료된 뒤 광고를 요청하세요.           |
| `-3` | `INITIALIZATION_FAILED` | SDK 초기화가 최종적으로 실패했습니다.         | 네트워크 상태를 확인하고 잠시 후 초기화를 재시도하세요.     |

### 광고 로드 실패

| 코드      | 이름                           | 발생 조건                                                | 권장 대응                                                                |
| ------- | ---------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------- |
| `204`   | `NO_FILL`                    | 광고 요청은 성공했으나 노출 가능한 광고가 없습니다.                        | 광고가 없을 때 발생하는 정상적인 응답입니다. 잠시 후 다시 요청하세요. 지속되면 app-ads.txt 설정을 확인하세요. |
| `-5001` | `AD_LOAD_FAILED`             | 요청한 광고를 로드하지 못했습니다.                                  | 일시적 실패일 수 있습니다. 잠시 후 다시 요청하세요.                                       |
| `-5603` | `INVALID_AD_UNIT_IDENTIFIER` | 잘못되었거나 비활성화된 광고 단위 ID, 앱 패키지명 불일치, 광고 단위 생성 직후 등입니다. | 광고 단위 ID와 앱 패키지명 설정을 점검하세요. 광고 단위를 방금 생성했다면 반영에 30\~60분이 걸립니다.       |

### 네트워크 오류

| 코드      | 이름                | 발생 조건                       | 권장 대응                 |
| ------- | ----------------- | --------------------------- | --------------------- |
| `-1009` | `NO_NETWORK`      | 기기가 인터넷에 연결되어 있지 않습니다.      | 기기의 인터넷 연결 상태를 확인하세요. |
| `-1000` | `NETWORK_ERROR`   | 일반적인 네트워크·서버 통신 오류입니다.      | 잠시 후 다시 요청하세요.        |
| `-1001` | `NETWORK_TIMEOUT` | 광고 요청이 제한 시간 안에 완료되지 않았습니다. | 잠시 후 다시 요청하세요.        |

### 전면 광고 상태 오류

전면·보상형 광고의 로드/표시 순서가 맞지 않을 때 발생하는 오류입니다. 대부분 SDK 내부 상태로 별도의 사용자 노출이 필요하지 않습니다.

| 코드    | 이름                                      | 발생 조건                                 | 권장 대응                         |
| ----- | --------------------------------------- | ------------------------------------- | ----------------------------- |
| `-23` | `FULLSCREEN_AD_ALREADY_SHOWING`         | 이미 전면 광고가 표시 중인데 다른 전면 광고를 표시하려 했습니다. | 별도 처리가 필요 없습니다.               |
| `-24` | `FULLSCREEN_AD_NOT_READY`               | 광고 로드가 완료되기 전에 표시를 시도했습니다.            | 광고 로드 완료 후 표시하세요.             |
| `-25` | `FULLSCREEN_AD_INVALID_VIEW_CONTROLLER` | 유효하지 않은 화면에서 전면 광고를 표시하려 했습니다.        | 유효한 화면(Activity)에서 광고를 표시하세요. |
| `-26` | `FULLSCREEN_AD_ALREADY_LOADING`         | 이미 로딩 중인 전면 광고를 다시 로드하려 했습니다.         | 중복 로드 호출을 피하세요.               |
| `-27` | `FULLSCREEN_AD_LOAD_WHILE_SHOWING`      | 광고가 표시 중인데 동일한 광고를 다시 로드하려 했습니다.      | 광고 표시가 끝난 후 다시 로드하세요.         |

***

## 에러 처리 예시

로드 실패는 광고 포맷별 리스너의 `onAdLoadFail(error: DaroError)` 콜백으로 전달됩니다. `errorCodeName`으로 분기하세요.

```kotlin theme={null}
loader.setListener(object : DaroInterstitialAdLoaderListener {
    override fun onAdLoadSuccess(ad: DaroInterstitialAd, adInfo: DaroAdInfo) {
    }

    override fun onAdLoadFail(error: DaroError) {
        when (error.errorCodeName) {
            DaroErrorCode.NO_FILL,
            DaroErrorCode.AD_LOAD_FAILED -> retryLater()
            DaroErrorCode.NO_NETWORK,
            DaroErrorCode.NETWORK_ERROR,
            DaroErrorCode.NETWORK_TIMEOUT -> showNetworkGuide()
            DaroErrorCode.INVALID_AD_UNIT_IDENTIFIER -> reportConfigError(error.errorMessage)
            else -> retryLater()
        }
    }
})
```

<Note>
  기존 `onAdLoadFail(err: DaroAdLoadError)` 콜백은 하위 호환을 위해 그대로 유지되지만 **deprecated** 되었습니다. 기존 콜백과 새 콜백이 모두 호출되므로, 새 코드는 `onAdLoadFail(error: DaroError)`만 구현하는 것을 권장합니다.
</Note>
