본문으로 건너뛰기
버전: In Development

에러 처리 가이드

예외 계층 구조

모든 aerospike-py 예외는 AerospikeError를 상속합니다. 전체 계층 구조와 설명은 Exceptions API 레퍼런스를 참고하세요.

import aerospike_py as aerospike
from aerospike_py import exception

권장 패턴

구체적 예외를 먼저, 그다음 포괄적 예외

항상 가장 구체적인 예외부터 캐치하세요:

from aerospike_py.exception import (
RecordNotFound,
AerospikeTimeoutError,
AerospikeError,
)

try:
_, meta, bins = client.get(key)
except RecordNotFound:
# 레코드 미존재 처리 (예: 기본값 반환)
bins = {}
except AerospikeTimeoutError:
# 재시도 또는 서킷 브레이커
raise
except AerospikeError as e:
# 예상치 못한 Aerospike 에러
logger.error("Aerospike error: %s", e)
raise

백오프를 적용한 재시도

타임아웃 및 클러스터 에러는 일시적인 경우가 많습니다:

import time
from aerospike_py.exception import AerospikeTimeoutError, ClusterError

def get_with_retry(client, key, max_retries=3):
for attempt in range(max_retries):
try:
return client.get(key)
except (AerospikeTimeoutError, ClusterError):
if attempt == max_retries - 1:
raise
time.sleep(0.1 * (2 ** attempt)) # 지수 백오프

Optimistic Locking (Check-and-Set)

세대(generation) 검사를 사용하여 동시 수정을 감지합니다:

from aerospike_py.exception import RecordGenerationError

def increment_counter(client, key, bin_name):
while True:
try:
_, meta, bins = client.get(key)
new_val = bins.get(bin_name, 0) + 1
client.put(
key,
{bin_name: new_val},
meta={"gen": meta.gen},
policy={"gen": aerospike.POLICY_GEN_EQ},
)
return new_val
except RecordGenerationError:
continue # 최신 데이터로 재시도

Upsert vs Create-Only

from aerospike_py.exception import RecordExistsError

# Create-only: 레코드가 존재하면 실패
try:
client.put(key, bins, policy={"exists": aerospike.POLICY_EXISTS_CREATE_ONLY})
except RecordExistsError:
print("레코드가 이미 존재합니다, 건너뜁니다")

# Upsert (기본값): 생성 또는 업데이트
client.put(key, bins) # RecordExistsError가 발생하지 않음

배치 에러 처리

배치 작업은 키별로 결과를 반환합니다. 개별 레코드 상태를 확인하세요:

batch = client.batch_read(keys)
for br in batch.batch_records:
if br.result == aerospike.AEROSPIKE_OK and br.record:
process(br.record.bins)
elif br.result == aerospike.AEROSPIKE_ERR_RECORD_NOT_FOUND:
handle_missing(br.key)
else:
logger.warning("배치 키 에러: code=%d", br.result)

연결 라이프사이클

from aerospike_py.exception import ClientError, ClusterError

client = aerospike.client(config)
try:
client.connect()
except ClusterError as e:
print(f"클러스터에 연결할 수 없습니다: {e}")
raise SystemExit(1)

try:
# ... 애플리케이션 로직 ...
pass
finally:
client.close()

비동기 에러 처리

비동기 에러도 동일한 방식으로 작동하며, await만 추가됩니다:

from aerospike_py.exception import RecordNotFound

async def get_user(client, user_id):
key = ("app", "users", user_id)
try:
_, _, bins = await client.get(key)
return bins
except RecordNotFound:
return None

결과 코드

예외에 매핑되는 주요 Aerospike 결과 코드:

코드상수예외
0AEROSPIKE_OK(성공)
2AEROSPIKE_ERR_RECORD_NOT_FOUNDRecordNotFound
5AEROSPIKE_ERR_RECORD_EXISTSRecordExistsError
9AEROSPIKE_ERR_TIMEOUTAerospikeTimeoutError
3(세대 에러)RecordGenerationError
13(레코드 너무 큼)RecordTooBig
27(필터링됨)FilteredOut

전체 목록은 상수 레퍼런스를 참고하세요.