Xử lý Lỗi
Tất cả các lỗi do SDK đưa ra đều mở rộng từ một kiểu cơ sở duy nhất, vì vậy bạn có thể bắt bất kỳ lỗi SDK nào ở một nơi hoặc phân nhánh theo lớp con cụ thể khi bạn cần phản ứng khác nhau. Hệ thống phân cấp giống hệt nhau trong SDK TypeScript và Python.
Hệ thống phân cấp lỗi
Error└── ImbraceError (cơ sở — bắt tất cả lỗi SDK) ├── AuthError (401, 403 — thông tin xác thực không hợp lệ hoặc hết hạn) ├── ApiError (4xx/5xx — yêu cầu bị máy chủ từ chối) └── NetworkError (hết thời gian, từ chối kết nối, lỗi DNS)Exception└── ImbraceError (cơ sở — bắt tất cả lỗi SDK) ├── AuthError (401, 403 — thông tin xác thực không hợp lệ hoặc hết hạn) ├── ApiError (4xx/5xx — yêu cầu bị máy chủ từ chối) └── NetworkError (hết thời gian, từ chối kết nối, lỗi DNS)Để biết các thông báo lỗi cụ thể và cách khắc phục đã biết, xem Khắc phục sự cố.
AuthError
Được đưa ra khi máy chủ trả về 401 hoặc 403 — thông tin xác thực không hợp lệ, hết hạn hoặc bị thu hồi.
import { AuthError } from "@imbrace/sdk";
try { const me = await client.platform.getMe();} catch (e) { if (e instanceof AuthError) { console.error("Cần xác thực lại:", e.message); }}from imbrace import AuthError
try: me = client.platform.get_me()except AuthError as e: print(f"Xác thực thất bại: {e}") # Xác thực lại trước khi thử lạiApiError
Được đưa ra cho tất cả các phản hồi 4xx và 5xx khác (sau khi đã thử lại hết cho 429/5xx).
import { ApiError } from "@imbrace/sdk";
try { await client.contacts.get("nonexistent_id");} catch (e) { if (e instanceof ApiError) { console.error(`HTTP ${e.statusCode}: ${e.message}`); // ví dụ: "HTTP 404: Contact not found" }}| Thuộc tính | Loại | Mô tả |
|---|---|---|
statusCode | number | Mã trạng thái HTTP |
message | string | Thông báo lỗi từ phản hồi máy chủ |
from imbrace import ApiError
try: client.contacts.get("nonexistent_id")except ApiError as e: print(f"HTTP {e.status_code}: {e}") # ví dụ: "HTTP 404: Contact not found"| Thuộc tính | Loại | Mô tả |
|---|---|---|
status_code | int | Mã trạng thái HTTP |
NetworkError
Được đưa ra khi yêu cầu không bao giờ đến được máy chủ — hết thời gian, lỗi DNS hoặc kết nối bị reset.
import { NetworkError } from "@imbrace/sdk";
try { await client.platform.getMe();} catch (e) { if (e instanceof NetworkError) { console.error("Không thể kết nối baseUrl:", e.message); // ví dụ: "Request timed out after 30000ms" }}from imbrace import NetworkError
try: client.platform.get_me()except NetworkError as e: print(f"Lỗi mạng: {e}") # ví dụ: "Network error or timeout: ConnectTimeout(...)"Bắt tất cả lỗi SDK
Import kiểu cơ sở để xử lý bất kỳ lỗi nào từ SDK trong một khối duy nhất:
import { ImbraceClient, ImbraceError, AuthError, ApiError, NetworkError,} from "@imbrace/sdk";
try { await client.platform.getMe();} catch (e) { if (e instanceof AuthError) return handleAuthError(e); if (e instanceof ApiError) return handleApiError(e); if (e instanceof NetworkError) return handleNetworkError(e); if (e instanceof ImbraceError) return handleUnknown(e); throw e; // ném lại lỗi không phải SDK}from imbrace import ImbraceError, AuthError, ApiError, NetworkError
try: result = client.platform.get_me()except AuthError as e: handle_auth_error(e)except ApiError as e: handle_api_error(e)except NetworkError as e: handle_network_error(e)except ImbraceError as e: handle_unknown_sdk_error(e)Hành vi thử lại tự động
Tầng vận chuyển HTTP trong cả hai SDK đều thử lại các lỗi tạm thời với exponential backoff.
| Điều kiện | Hành động |
|---|---|
| HTTP 429 / 503 | Thử lại tối đa 3 lần, mọi method |
| HTTP 5xx (khác) | Thử lại tối đa 3 lần với GET, HEAD, OPTIONS, PUT, DELETE |
| Lỗi mạng / hết thời gian | Thử lại tối đa 3 lần với GET, HEAD, OPTIONS, PUT, DELETE |
| HTTP 401 / 403 | Không thử lại — ném AuthError ngay lập tức |
| HTTP 4xx (khác) | Không thử lại — ném ApiError ngay lập tức |
POST và PATCH không được thử lại khi hết thời gian, lỗi mạng hoặc 5xx khác 503, vì máy chủ có thể đã thực thi chúng.
Backoff: với 429/503, SDK chờ theo header Retry-After (số giây hoặc ngày HTTP) nếu máy chủ gửi, tối đa 60 giây; Retry-After dài hơn thì ném ApiError ngay. Nếu không có header: 2^retryCount giây giữa các lần thử (1s → 2s → 4s). Trường hợp xấu nhất: tổng cộng 4 lần thử.
Cấu hình (1.7.0+): maxRetries đặt số lần thử lại (0 = chỉ một lần gọi). fetch thay fetch dùng cho mọi request, ví dụ để tự thêm lớp retry, proxy hoặc tracing.
const client = new ImbraceClient({ apiKey: process.env.IMBRACE_API_KEY, maxRetries: 0, // SDK chỉ gọi một lần; tự retry ở lớp của bạn fetch: myFetch, // tuỳ chọn});| Điều kiện | Hành động |
|---|---|
| HTTP 429 / 503 | Thử lại tối đa 3 lần, mọi method |
| HTTP 5xx (khác) | Thử lại tối đa 3 lần với GET, HEAD, OPTIONS, PUT, DELETE |
| Lỗi mạng / hết thời gian | Thử lại tối đa 3 lần với GET, HEAD, OPTIONS, PUT, DELETE |
| HTTP 401 / 403 | Không thử lại — đưa ra AuthError ngay lập tức |
| HTTP 4xx (khác) | Không thử lại — đưa ra ApiError ngay lập tức |
Backoff: với 429/503, SDK chờ theo header Retry-After (số giây hoặc ngày HTTP) nếu máy chủ gửi, tối đa 60 giây; Retry-After dài hơn thì đưa ra ApiError ngay. Nếu không có header: 2^retryCount giây giữa các lần thử (1s → 2s → 4s). Trường hợp xấu nhất: tổng cộng 4 lần thử.
Cấu hình (1.4.0+): max_retries đặt số lần thử lại (0 = chỉ một lần gọi).
client = ImbraceClient(api_key=os.environ["IMBRACE_API_KEY"], max_retries=0)Thời gian chờ yêu cầu
Cấu hình thời gian chờ khi tạo client (mặc định: 30 s). Khi hết thời gian chờ, yêu cầu đang thực hiện sẽ bị hủy và NetworkError được ném/đưa ra.
const client = new ImbraceClient({ timeout: 15_000 }); // mili giâyclient = ImbraceClient(timeout=15) # giâyXử lý lỗi bất đồng bộ (Python)
Client bất đồng bộ đưa ra các loại ngoại lệ giống hệt nhau:
from imbrace import AsyncImbraceClient, AuthError, ApiError
async with AsyncImbraceClient() as client: try: me = await client.platform.get_me() except AuthError: print("Cần xác thực lại") except ApiError as e: print(f"[{e.status_code}] {e}")Phương pháp tốt nhất
// 1. Luôn xử lý AuthError riêng — cần làm mới thông tin xác thực// 2. Ghi log ApiError.statusCode — 400 = tham số sai, 404 = không tìm thấy, 409 = xung đột// 3. Bọc các điểm vào cấp cao nhất trong try/catch// 4. Không thử lại AuthError — sẽ không giúp ích cho đến khi thông tin xác thực được sửa
async function safeGetMe(client: ImbraceClient) { try { return await client.platform.getMe(); } catch (e) { if (e instanceof AuthError) { await refreshCredentials(); return await client.platform.getMe(); } throw e; }}# 1. Sử dụng context manager để kết nối luôn được đóng một cách chắc chắnwith ImbraceClient() as client: ...
# 2. Xử lý AuthError riêng — cần làm mới thông tin xác thực trước khi thử lạidef safe_get_me(client): try: return client.platform.get_me() except AuthError: refresh_credentials(client) return client.platform.get_me()
# 3. Phân nhánh theo status_code cho ApiErrortry: client.contacts.update(contact_id, data)except ApiError as e: if e.status_code == 409: print("Xung đột — liên hệ đã được sửa đổi") elif e.status_code == 400: print(f"Dữ liệu không hợp lệ: {e}")