콘텐츠로 이동

한국어 | English

레퍼런스 목차

05. Errors

이 category는 core의 result-enum-family 표에 대응하는 이 레퍼런스의 대응 문서다 — 공유 error enum과, 모든 submit/request/recv/handler/close/ bind/connect/config 실패 API가 Result::Err로 반환하는 7개 typed error struct를 문서화한다. 정확한 signature는 contracts/errors/가 소유한다.


Typed error family

각 API family는 모든 필드에 대해 단일 공유 error 타입이 아니라 typed result enum을 담은 자신만의 typed error struct를 갖는다 — caller는 구체적 struct의 .code 필드를 match하거나, 공유 ZlinkError enum으로 변환(또는 match)한다. 8개 전부 하나의 내부 macro(define_error_type!)로 생성되며, 각각 동일한 형태를 가진다: code: TResult 필드, native_errno: i32 필드, new(code, native_errno), code()/native_errno() accessor, Display, std::error::Error, From<Self> for ZlinkError.

Error struct Result enum 반환하는 곳
SubmitError SubmitResult(Messaging category) send/publish/request-submit API Backpressured(1, 정상 제어 흐름), NotConnected(2), NotFound(3), Terminated(4), InvalidHandle(5), InvalidArgument(6), NotSupported(7), InvalidState(8), ThreadViolation(9), OutOfMemory(10), SeqExhausted(11), InternalError(12), NotAdmitted(13, 정상 제어 흐름)
RequestError RequestResult Future submit() 또는 blocking submit_sync() terminal request 실패 TimedOut(101), NotFound(102), Terminated(103), ProtocolError(104), InternalError(105), Rejected(106), Conflict(107), Busy(108), NotConnected(109), InvalidArgument(110), InvalidState(111), NotSupported(112), Backpressured(113)
RecvError RecvResult recv-family API NoData(201), Busy(202), Terminated(203), InvalidHandle(204), NotSupported(205), InternalError(206) — 6개 값 집합(BufferTooSmall/InvalidState 없음, dotnet/cpp/java와 일치, node의 8개 값 집합과 다름)
HandlerError HandlerResult 유지되는 result family; 현행 public completion/event 전달은 handler를 등록하지 않음 InvalidArgument(301), Busy(302), NotSupported(303), Deadlock(304), InvalidHandle(305), InternalError(306)
CloseError CloseResult close() 경로, Context::shutdown() Busy(401), Shutdown(402), InvalidHandle(403), InternalError(404)
BindError BindResult bind(...) InvalidArgument(501), AddrInUse(502), NotSupported(503), InvalidHandle(504), InternalError(505)
ConnectError ConnectResult connect/unbind/disconnect/disconnect_rid InvalidArgument(601), NotSupported(602), InvalidHandle(603), InternalError(604), NotFound(605), Conflict(606), Busy(607) — 7개 값(AuthFailed 없음, dotnet/cpp/java와 일치, node의 8개 값 집합과 다름)
ConfigError ConfigResult 모든 socket/context option getter/setter InvalidHandle(701), InvalidArgument(702), NotSupported(703), InternalError(704), InvalidState(705), NotFound(706) — 6개 값 집합(cpp/java와 일치, dotnet/node의 9개 값 집합과 다름)

언어간 비대칭, 여기서 다시 명시. 모든 wrapper binding의 result enum은 core의 zlink_*_result_t family(core Errors category에 문서화됨)를 정확히 반영해야 하지만 auxiliary receive/connect/config 값은 모든 binding이 같게 노출하지 않는다. 다만 RequestResult는 공통 terminal Backpressured(113)를 포함한다.

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


ZlinkError

Rust다운 공유 error 타입 — 상속 기반 class가 아니라, typed error struct마다 variant 하나씩을 가진 enum.

match dealer.send().message(part).submit_sync() {
    Ok(()) => { /* Core가 terminal acceptance를 보고 */ }
    Err(err) => {
        let zlink_err: ZlinkError = err.into();
        if zlink_err.code() == SubmitResult::Backpressured as i32 {
            // 정상 제어 흐름이지 실제 실패가 아니다
        }
    }
}

Options. 각 typed error struct가 From<Self> for ZlinkError를 구현하므로, .into()/?(error 타입이 ZlinkError일 때)가 자동으로 변환한다.

Member 의미
Submit(SubmitError) / Request(RequestError) / Recv(RecvError) / Handler(HandlerError) / Close(CloseError) / Bind(BindError) / Connect(ConnectError) / Config(ConfigError) typed error struct마다 variant 하나씩
code(&self) -> i32 variant를 match해서 내부 code 필드를 i32로 캐스팅해 반환
native_errno(&self) -> i32 variant를 match해서 내부 native_errno 필드를 반환

Completion result. 해당 없음 — Displaystd::error::Error를 구현하는 순수 sum-type wrapper.

선택 기준. 특정 result enum의 variant가 중요할 땐 주어진 API가 반환하는 구체적 typed error struct를 match한다. 함수 본문 전체에서 8개 서로 다른 struct 타입을 match하는 것보다 단일 error 타입이 더 편할 땐 ZlinkError로 변환한다(.into(), 또는 Result<_, ZlinkError>를 반환하는 함수에서 ?가 대신 하게 둠). no-data와 일시적 back-pressure는 절대 error로 보고되지 않는다 — 대신 Sockets/Messaging category의 bool/Option 반환 recv/submit 관례를 참고한다.


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