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

# 오류

> 게이트웨이 오류 코드 19종과 대응하는 SDK 오류 클래스를 정리했어요.

## 할 수 있는 일

게이트웨이 오류 코드를 SDK 오류 클래스로 받아요. 전부 공통 베이스(`TelloError` /
`TelloException`)를 상속하고, 게이트웨이 코드를 `code` 필드에 담고 있어요.

<Warning>
  **분기는 `code`로 하고 메시지로는 하지 마세요.** 메시지는 언제든 다시 쓰일 수 있는 표시용
  문자열이에요.
</Warning>

명령 단위 오류는 소켓을 닫지 않고 `error` 이벤트 구독자에게도 전달돼요. 통화를 끝낸 오류라면
`waitClosed`가 그 오류를 다시 던져요.

## 명령 검증 · 세션 상태

| 코드                   | 클래스                      | 언제                                                             |
| -------------------- | ------------------------ | -------------------------------------------------------------- |
| `unauthenticated`    | `AuthenticationError`    | 키 거부, `4401` 종료, `auth.ok` 대기 타임아웃                             |
| `toRequired`         | `ValidationError`        | [createCall](/developer/sdk/commands/create-call)에 `to` 누락     |
| `callIdRequired`     | `ValidationError`        | [getSummary](/developer/sdk/commands/get-summary)에 `callId` 누락 |
| `dtmfDigitsRequired` | `ValidationError`        | [sendDtmf](/developer/sdk/commands/send-dtmf)에 `digits` 누락     |
| `dtmfDigitsInvalid`  | `ValidationError`        | `digits`에 `0-9 * #` 외 문자                                       |
| `callNotFound`       | `ValidationError`        | `getSummary` 대상 통화 없음                                          |
| `callNotCompleted`   | `ValidationError`        | `getSummary` 통화가 아직 미완료                                        |
| `callAlreadyActive`  | `CallAlreadyActiveError` | 이미 활성 통화가 있음                                                   |
| `noActiveCall`       | `NoActiveCallError`      | 활성 통화 없이 `answer`·`sendDtmf`                                   |
| `callRejected`       | `CallRejectedError`      | 의도 검증에서 거부. `question` 동반 가능                                   |
| `internalError`      | `TelloServerError`       | 서버 내부 결함                                                       |

## createCall 거부: 계정 정책

전부 `CallRefusedError`예요. 통화가 만들어지기 전에 거부되므로 `call.created`도 `callId`도
과금도 없어요. 앞의 세 가지는 계정 소유자가 조치할 수 있어요.

| 코드                        | 뜻                 | 대응                                         |
| ------------------------- | ----------------- | ------------------------------------------ |
| `insufficientCredit`      | 크레딧 잔액 없음         | [충전](/settings/credits)을 안내해요. 재전송해도 소용없어요 |
| `concurrentLimitExceeded` | 동시 발신 회선을 모두 사용 중 | 자기 통화가 끝나기를 기다렸다 다시 걸어요                    |
| `callerNotVerified`       | 수신 번호가 인증되지 않음    | [수신번호 등록](/calls/caller-id)을 안내해요          |
| `noRepresentativeNumber`  | 발신 번호가 설정되지 않음    | [전화번호 관리](/calls/numbers)를 안내해요            |

## createCall 거부: 서비스측 상태

전부 `CallProviderError`예요. 호출자가 원인을 만들지 않았고 고칠 수도 없어요.

| 코드                         | 뜻                     | 대응                           |
| -------------------------- | --------------------- | ---------------------------- |
| `callProviderUnauthorized` | 통화 제공자가 서비스 자격 증명을 거부 | 서비스 장애로 알려주세요. 재전송은 도움이 안 돼요 |
| `callProviderDraining`     | 제공자가 신규 통화를 받지 않음     | 나중에 다시 시도해요                  |
| `callProviderUnavailable`  | 제공자가 미디어 룸을 만들지 못함    | 나중에 다시 시도해요                  |
| `callSetupFailed`          | 제공자가 거부했고 사유를 분류하지 못함 | 실패로 처리하고 알려주세요               |

<Warning>
  **게이트웨이는 이 거부들을 재시도하지 않아요.** 거부는 한 번 전달되고 연결은 바로 다시
  `createCall`을 낼 수 있는 상태가 돼요. 재시도 정책은 여러분 몫이고, 나중에 성공할 수 있는
  것은 `concurrentLimitExceeded` · `callProviderDraining` · `callProviderUnavailable`
  세 가지뿐이에요.
</Warning>

## 연결 종료

| Close code | 뜻                               | 클래스                              |
| ---------- | ------------------------------- | -------------------------------- |
| `1000`     | 정상 종료                           | 없음                               |
| `1001`     | 서버 종료                           | 통화 중이었으면 `ConnectionClosedError` |
| `4401`     | 인증 실패, 또는 10초 안에 `auth` 프레임 미도착 | `AuthenticationError`            |

`4401`·`1001` 말고 다른 코드로 닫혀도, 통화가 진행 중이었다면 `ConnectionClosedError`가
나요. 통화가 없는 상태의 종료는 오류가 아니에요.

하트비트 타임아웃으로 끊길 때는 close 프레임 없이 소켓이 종료돼요.

## 주의사항

* 재연결·세션 재개 프로토콜이 없어요. 비정상 종료는 통화를 처음부터 다시 시작해요.
* 언어별로 클래스 이름만 달라요. Java는 `Error` 대신 `Exception`을 써요
  (`ValidationException` 등).

## 관련 문서

* [레퍼런스](/developer/sdk/reference)
* [이벤트](/developer/sdk/events)
* [연동 준비](/developer/overview)
