콘텐츠로 이동

한국어 | 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 타입이 아니라 자신만의 result enum을 담은 자신만의 typed exception을 던진다(binding_error_t에서 파생) — caller는 구체적 타입(또는 공유 binding_error_t 기반)을 잡아 .result()를 호출한다.

Exception Result enum 던지는 곳 값
submit_error_t submit_result_t(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, 정상 제어 흐름)
request_error_t request_result_t(Messaging category) submit() awaitable 또는 blocking request terminal 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)
recv_error_t recv_result_t(Sockets category) recv-family API no_data(201), busy(202), terminated(203), invalid_handle(204), not_supported(205), internal_error(206), buffer_too_small(207), invalid_state(208)
handler_error_t handler_result_t 유지되는 result family; 현행 public completion/event 전달에는 등록형 handler가 없음 invalid_argument(301), busy(302), not_supported(303), deadlock(304), invalid_handle(305), internal_error(306)
close_error_t close_result_t close() 경로, context_t::shutdown() busy(401), shutdown(402), invalid_handle(403), internal_error(404)
bind_error_t bind_result_t socket_t::bind(...) invalid_argument(501), addr_in_use(502), not_supported(503), invalid_handle(504), internal_error(505)
connect_error_t connect_result_t connect/unbind/disconnect/disconnect_rid invalid_argument(601), not_supported(602), invalid_handle(603), internal_error(604), not_found(605), conflict(606), busy(607), auth_failed(608)
config_error_t config_result_t 모든 socket/context option getter/setter와 poller_t 등록·size 작업 invalid_handle(701), invalid_argument(702), not_supported(703), internal_error(704), invalid_state(705), not_found(706), conflict(707), buffer_too_small(708), busy(709)

Core 결과와의 대응. 각 enum은 Public Result Enum 카탈로그의 값을 모두 가진다. Core가 돌려준 결과는 그대로 전달하고, 닫힌 handle처럼 Core에 들어가지 않고 끝난 호출은 Core의 errno 대응표와 같은 결과를 낸다. 예를 들어 사용자 close 뒤의 option 설정은 invalid_state(705)/ESHUTDOWN, context close 뒤에는 internal_error(704)/ETERM이다. poller_t::wait() 실패는 recv_error_t로 보고한다. 예를 들어 Core의 EBUSY는 busy(202)가 된다. poller_t::close()의 EBUSY는 close_error_t의 busy(401)로 보고하며 poller는 유효한 상태로 남는다.

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


binding_error_t

위 모든 typed exception이 상속하는 abstract 기반(그 자신은 std::runtime_error에서 파생).

try {
    std::move (dealer.send ()).message (part).submit ();
} catch (const zlink::submit_error_t &ex) {
    if (ex.result () == zlink::submit_result_t::backpressured) {
        // 정상 제어 흐름이지 실제 실패가 아니다
    }
}

Options.

Member 의미
binding_error_t(int code_, int internal_errno_) protected 생성자만 존재 — public 진입점은 각 typed exception 자신의 result enum을 받는 생성자다(예: submit_error_t(submit_result_t)), 또는 native result에서 변환할 때 내부적으로 쓰이는 명시적 internal_errno_를 더한 같은 생성자
code() int, 실패를 분류하는 zlink result code
internal_errno() int, 밑에 깔린 native errno, 또는 1-인자 형태로 생성됐으면 code()와 같은 값
what() 재정의된 std::runtime_error::what(), 포맷된 메시지 텍스트 반환

Completion result. 해당 없음 — 이건 exception 계층 자체다. error_t(family에 속하지 않는 일반 exception)는 error_t(int code_) 또는 error_t(int code_, int internal_errno_)로 raw code에서 직접 생성할 수 있다.

선택 기준. 구체적 typed exception(submit_error_t 등)을 잡아 enum 타입의 .result()를 호출하거나, exception 타입 전체에 걸쳐 .code()/.what()만 일반적으로 필요할 땐 공유 binding_error_t 기반(또는 순수 std::exception)을 잡는다. no-data와 일시적 back-pressure는 절대 일반 exception으로 보고되지 않는다 — 대신 Sockets/Messaging category의 int/bool 반환 recv/submit 관례를 참고한다.


Contracts/Errors/와 C++ 바인딩 스펙에서 전체 근거를 확인한다.