> ## 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 iOS SDK의 통합 에러 코드(DaroError.Code)와 DaroError 객체로 광고 로드 실패를 일관되게 처리하는 방법을 안내합니다.

## 개요

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

***

## DaroError 객체

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

| 프로퍼티 | 타입 | 설명 |
| - | - | - |
| `code` | `DaroError.Code` | 통합 에러 코드의 이름(enum)입니다. 분기 처리에 사용하세요. |
| `message` | `String` | 오류 메시지입니다. 로깅·디버깅에 활용하세요. |
| `localizedDescription` | `String` | 사용자에게 표시하거나 로깅할 수 있는 오류 설명입니다. |

`DaroError.Code`는 정수 raw value를 가집니다. 필요하면 `error.code.rawValue`로 정수 값을 확인할 수 있습니다.

***

## 통합 에러 코드

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

### 초기화·설정 오류

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

### 광고 로드 실패

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

### 네트워크 오류

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

### 전체 화면 광고 상태 오류

전체 화면 광고(인터스티셜 광고·리워드 비디오 광고 등)의 로드/표시 순서가 맞지 않을 때 발생하는 오류입니다. 대부분 SDK 내부 상태로 별도의 사용자 노출이 필요하지 않습니다.

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

<Note>
  통합 코드 체계는 iOS와 Android가 동일한 값을 공유합니다. 이 중 `notInitialized`(-2), `fullscreenAdAlreadyLoading`(-26), `fullscreenAdLoadWhileShowing`(-27)은 플랫폼 간 일관성을 위해 정의되어 있으나 현재 iOS에서는 실제로 발생하지 않을 수 있습니다.
</Note>

***

## 에러 처리 예시

로드 실패는 광고 포맷별 리스너의 `onAdLoadFail` 클로저로 전달됩니다. `error.code`로 분기하세요.

```swift theme={null}
daroInterstitialLoader.listener.onAdLoadFail = { error in
    switch error.code {
    case .noFill, .adLoadFailed:
        retryLater()
    case .noNetwork, .networkError, .networkTimeout:
        showNetworkGuide()
    case .invalidAdUnitIdentifier:
        reportConfigError(error.message)
    default:
        retryLater()
    }
}
```
