จัดการข้อผิดพลาดอย่างเหมาะสมในระบบ production เพื่อป้องกันความล้มเหลวแบบเงียบ ๆ เมื่อการเรียกอย่างเช่น getResult() ล้มเหลว SDK จะโยน TracioError ออกมา ซึ่งเป็นซับคลาสของ Error ที่มีฟิลด์ code ที่เครื่องอ่านได้
ครอบ await tracio.getResult() ไว้ใน try/catch แล้วจำกัดชนิดของค่าที่ถูกโยนด้วย isTracioError() จากนั้นแยกเงื่อนไขตาม error.code:
import { Tracio, isTracioError, isRetryableError } from "@tracio/sdk"
const tracio = Tracio.init({ publicKey: "5ca175fc..." })
try { const result = await tracio.getResult() console.log(result.visitorId, result.bot.detected)} catch (error) { if (isTracioError(error)) { if (isRetryableError(error)) { // Transient failure (network, timeout, blocked script, upstream) — // a fresh attempt may succeed. console.warn(`Retryable TRACIO error: ${error.code}`) } else { // Terminal failure (bad config, misuse, destroyed instance) — // fix the caller; retrying the same call will not help. console.error(`Terminal TRACIO error: ${error.code} — ${error.message}`) } } else { console.error("Unexpected error:", error) }}Agent จะโหลดแบบอะซิงโครนัสอยู่เบื้องหลัง หากการโหลดล้มเหลวก่อนที่คุณจะเรียก getResult() เสียอีก ความล้มเหลวนั้นจะถูกส่งผ่าน callback onError ให้ลงทะเบียน callback นี้ทันทีหลังจาก init():
const tracio = Tracio.init({ publicKey: "5ca175fc..." })
tracio.onError((error) => { // Same TracioError instance you would catch from getResult(). console.warn(`TRACIO failed to initialize: ${error.code}`)})
tracio.onReady((result) => { console.log("Visitor identified:", result.visitorId)})ข้อผิดพลาดเดียวกันยังคงสังเกตได้ผ่าน getResult() คุณจึงเลือกใช้ช่องทางใดก็ได้
TracioError ทุกตัวจะมี code ชนิด TracioErrorCode ตัว getter retryable (และฟังก์ชันช่วย isRetryableError()) จะบอกว่าการลองใหม่มีโอกาสสำเร็จหรือไม่
| Code | ความหมาย | Retryable |
|---|---|---|
invalid_config | config ที่ส่งให้ Tracio.init() ไม่ถูกต้อง | ไม่ |
multiple_keys | มีการใช้ public key มากกว่าหนึ่งตัวในหน้าเดียวกัน | ไม่ |
non_browser | getResult() ถูก await นอกเบราว์เซอร์ (เช่น บนเซิร์ฟเวอร์) | ไม่ |
load_failed | สคริปต์ของ agent โหลดไม่สำเร็จ | ใช่ |
blocked | สคริปต์ถูกบล็อก (ตัวบล็อกโฆษณาหรือ CSP) | ใช่ |
script_error | สคริปต์ที่โหลดมาโยนข้อผิดพลาดขณะกำลังเริ่มต้น | ใช่ |
network | ความล้มเหลวด้านเครือข่าย/การรับส่งข้อมูลขณะเข้าถึง API | ใช่ |
timeout | การเรียกเกินงบเวลา timeoutMs ที่กำหนดไว้ | ใช่ |
server | edge/เซิร์ฟเวอร์ส่งคืนความล้มเหลวจาก upstream | ใช่ |
destroyed | อินสแตนซ์ถูกทำลาย (ผ่าน destroy()) ก่อนการเรียก | ไม่ |
รหัสแบบสิ้นสุด (invalid_config, multiple_keys, non_browser, destroyed) บ่งชี้ถึงปัญหาด้านการตั้งค่า การใช้งาน หรือวงจรชีวิต — ให้แก้ที่ฝั่งผู้เรียก หรือเรียก Tracio.init() อีกครั้ง ส่วนรหัสแบบ retryable นั้นเป็นเพียงชั่วคราว และการลองใหม่อาจสำเร็จได้
สำหรับข้อผิดพลาดแบบ retryable ให้ลองใหม่แบบ backoff ด้วยการเริ่มความพยายามใหม่ทั้งหมด แทนที่จะ await promise ตัวเดิมที่ถูกปฏิเสธไปแล้วซ้ำ:
import { Tracio, isRetryableError } from "@tracio/sdk"
async function identifyWithRetry(maxAttempts = 3) { let attempt = 0 while (true) { const tracio = Tracio.init({ publicKey: "5ca175fc..." }) try { return await tracio.getResult() } catch (error) { attempt++ // Tear down before retrying: init() returns the cached instance for the // same key, and getResult() caches its (rejected) promise — so a genuine // fresh attempt requires destroy() first. tracio.destroy() if (!isRetryableError(error) || attempt >= maxAttempts) throw error await new Promise((r) => setTimeout(r, 2 ** attempt * 250)) } }}