콘텐츠로 이동

한국어 | English

레퍼런스 목차

05. Errors

이 category는 core의 result-enum-family 표에 대응하는 이 레퍼런스의 대응 문서다 — 공유 exception 계층과, 모든 submit/request/recv/event/close/ bind/connect/config 실패 API(Sockets/Messaging/Eventing/Core category)가 던지는 7개 typed exception을 문서화한다. 정확한 signature는 contracts/errors/가 소유한다.


Typed exception family

각 API family는 단일 공유 exception 타입이 아니라 typed result enum을 담은 자신만의 typed exception을 던진다 — caller는 구체적 타입(또는 공유 ZlinkException 기반)을 잡아 .getResult()를 호출한다. 계층은 Java sealed class다: ZlinkException(public, abstract sealed, permits TypedZlinkException) → TypedZlinkException(package-private, abstract sealed, application 코드에서 이름으로 직접 참조 불가) → 아래 각 concrete exception(public final).

Exception Result enum 던지는 곳
ZlinkSubmitException SubmitResult(Sockets category) send/publish/request-submit API BACKPRESSURED(1, 정상 제어 흐름), NOT_CONNECTED(2), NOT_FOUND(3), TERMINATED(4), INVALID_HANDLE(5), INVALID_ARGUMENT(6), NOT_SUPPORTED(7), INVALID_STATE(8), THREAD_VIOLATION(9), OUT_OF_MEMORY(10), SEQ_EXHAUSTED(11), INTERNAL_ERROR(12), NOT_ADMITTED(13, 정상 제어 흐름)
ZlinkRequestException RequestResult(Sockets category) submit_sync() 또는 submit() terminal request 실패 TIMED_OUT(101), NOT_FOUND(102), TERMINATED(103), PROTOCOL_ERROR(104), INTERNAL_ERROR(105), REJECTED(106), CONFLICT(107), BUSY(108), NOT_CONNECTED(109), INVALID_ARGUMENT(110), INVALID_STATE(111), NOT_SUPPORTED(112), BACKPRESSURED(113)
ZlinkRecvException RecvResult(Sockets category) recv-family API NO_DATA(201), BUSY(202), TERMINATED(203), INVALID_HANDLE(204), NOT_SUPPORTED(205), INTERNAL_ERROR(206)
ZlinkHandlerException HandlerResult 유지되는 result family; 현행 public completion/event 전달에는 등록형 handler가 없음 INVALID_ARGUMENT(301), BUSY(302), NOT_SUPPORTED(303), DEADLOCK(304), INVALID_HANDLE(305), INTERNAL_ERROR(306)
ZlinkCloseException CloseResult close() 경로, Context.shutdown() BUSY(401), SHUTDOWN(402), INVALID_HANDLE(403), INTERNAL_ERROR(404)
ZlinkBindException BindResult Socket.bind(...) INVALID_ARGUMENT(501), ADDR_IN_USE(502), NOT_SUPPORTED(503), INVALID_HANDLE(504), INTERNAL_ERROR(505)
ZlinkConnectException ConnectResult connect/unbind/disconnect/disconnectRid INVALID_ARGUMENT(601), NOT_SUPPORTED(602), INVALID_HANDLE(603), INTERNAL_ERROR(604), NOT_FOUND(605), CONFLICT(606), BUSY(607)
ZlinkConfigException ConfigResult 모든 socket/context option getter/setter INVALID_HANDLE(701), INVALID_ARGUMENT(702), NOT_SUPPORTED(703), INTERNAL_ERROR(704), INVALID_STATE(705), NOT_FOUND(706)

언어간 비대칭. 이 binding의 ConfigResult는 값이 6개뿐이며 NOT_FOUND(706)에서 멈춘다 — cpp의 config_result_t와 일치하지만, dotnet의 ZlinkConfigException.ErrorCode는 추가로 Conflict(707), BufferTooSmall(708), Busy(709)를 정의한다. 이 binding의 ConfigResult가 이 세 값을 가져야 하는지는 스펙 차원의 질문이며 이 레퍼런스의 범위 밖이다.

각 값 family가 실제로 뜻하는 것. SubmitResultBACKPRESSURED/ NOT_CONNECTED/NOT_FOUND/NOT_ADMITTED는 예외적 실패가 아니라 정상적인 실행 흐름이다 — non-OK submit 결과를 전부 같게 취급하는 caller는 "재시도가 합리적"과 "이대로 제출하면 절대 성공하지 않음"의 구분을 잃는다. INVALID_STATE는 stale handle이나 닫힌 수신·연결 상태를 다룬다. HandlerResult family는 남아 있지만 현행 public send/request terminal과 pull-event 표면은 이를 생성하지 않는다.


ZlinkException

모든 typed exception이 (package-private 중간 계층 TypedZlinkException을 거쳐) 파생하는 public abstract 기반.

try {
    dealer.send().message(part).submit();
} catch (ZlinkSubmitException ex) {
    if (ex.getResult() == SubmitResult.BACKPRESSURED) {
        // 정상 제어 흐름이지 실제 실패가 아니다
    }
}

Options. 생성자는 protected다 — 임의 typed exception을 만드는 public 진입점은 그 exception 자신의 result enum을 받는 public 생성자다 (ZlinkSubmitException(SubmitResult) 등), 또는 명시적 nativeErrno를 더한 같은 생성자다.

Member 의미
getCode() int, 실패를 분류하는 zlink result code
getNativeErrno() int, 밑에 깔린 native errno, 없으면 0
fromLastError(String operation) / fromLastError(ErrorCategory) static factory; 현재 native errno와 ErrorCategory(CONFIG/BIND/CONNECT/CLOSE/HANDLER/RECV/REQUEST/SUBMIT)로부터 올바른 타입의 exception을 만든다 — String operation overload는 operation 이름에서 category를 추론한다
fromErrno(String operation, int errno) / fromErrno(ErrorCategory, int errno) static factory; fromLastError와 같은 매핑이지만 현재 native errno를 읽는 대신 명시적 errno를 받는다

Completion result. 해당 없음 — 이건 exception 계층 자체다. TypedZlinkException(중간 sealed class)은 package-private다 — application 코드는 ZlinkException이나 구체적 subclass를 잡거나 참조할 수 있지만, TypedZlinkException을 이름으로 직접 참조할 수 없다.

선택 기준. 구체적 typed exception(ZlinkSubmitException 등)을 잡아 enum 타입의 getResult()를 호출하거나, exception 타입 전체에 걸쳐 getCode()/getNativeErrno()만 일반적으로 필요할 땐 공유 ZlinkException 기반을 잡는다. no-data와 일시적 back-pressure는 절대 일반 exception으로 보고되지 않는다 — 대신 Sockets/Messaging category의 boolean 반환 recv/submit 관례를 참고한다. raw errno로부터 올바른 타입의 exception을 만들어야 하는 custom native interop 경로를 구현할 때만 ZlinkException.fromErrno(...)/fromLastError(...)를 쓴다 — 일반 application 코드는 이걸 호출할 필요가 없다, 모든 내장 API가 이미 스스로 올바른 타입의 exception을 던지기 때문이다.


contracts/errors/Java 바인딩 스펙에서 전체 근거를 확인한다.