การจัดการ Error ใน API
เมื่อสร้าง API สิ่งสำคัญอย่างยิ่งคือการจัดการข้อผิดพลาด (Error Handling) อย่างเหมาะสม เพื่อให้ Client ที่เรียกใช้งาน API สามารถเข้าใจได้ว่าเกิดอะไรขึ้น และสามารถแก้ไขปัญหาได้อย่างถูกต้อง การจัดการ Error ที่ดีจะช่วยให้ API ของคุณมีความน่าเชื่อถือและใช้งานง่ายยิ่งขึ้น
ทำไมต้องจัดการ Error?
- ให้ข้อมูลที่ชัดเจน: Client ต้องการทราบว่าเกิดอะไรผิดพลาด เพื่อที่จะแก้ไขปัญหาได้
- ป้องกันการ Crash: การจัดการ Error ช่วยป้องกันไม่ให้ API ของคุณหยุดทำงาน (Crash) เมื่อเกิดข้อผิดพลาดที่ไม่คาดฝัน
- รักษาความปลอดภัย: การจัดการ Error ที่ไม่ดี อาจทำให้ข้อมูลสำคัญรั่วไหลได้
- ประสบการณ์ที่ดีของผู้ใช้: API ที่จัดการ Error ได้ดีจะช่วยให้ผู้ใช้งาน API มีประสบการณ์ที่ดี
การใช้ Try-Catch ใน PHP
try-catch เป็นโครงสร้างพื้นฐานในการจัดการ Exception (ข้อยกเว้น) ใน PHP เมื่อเกิด Exception ขึ้นใน Block try โปรแกรมจะกระโดดไปยัง Block catch เพื่อจัดการกับ Exception นั้น
try {
// โค้ดที่อาจทำให้เกิด Exception
$result = 10 / 0; // การหารด้วย 0 จะทำให้เกิด Exception
echo "ผลลัพธ์คือ: " . $result; // บรรทัดนี้จะไม่ถูก Execute หากเกิด Exception
} catch (Exception $e) {
// โค้ดสำหรับจัดการ Exception
echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}
คำอธิบาย:
try: Block ที่เราใส่โค้ดที่อาจทำให้เกิด Exceptioncatch (Exception $e): Block ที่เราจะจัดการกับ Exception ที่เกิดขึ้น โดย$eเป็น Object ของ Exception ที่เกิดขึ้น เราสามารถใช้ MethodgetMessage()เพื่อดึงข้อความ Error ได้
การสร้าง Error Response
เมื่อเกิด Error ใน API เราควรส่ง Response กลับไปยัง Client ที่มีข้อมูลเกี่ยวกับ Error นั้น โดยทั่วไปเราจะใช้ JSON Format ในการส่ง Error Response และกำหนด HTTP Status Code ที่เหมาะสม
<?php
// กำหนด Header เป็น JSON
header('Content-Type: application/json');
try {
// โค้ดที่อาจทำให้เกิด Exception
$id = $_GET['id'];
if (!is_numeric($id)) {
throw new Exception("ID ต้องเป็นตัวเลขเท่านั้น");
}
// สมมติว่ามี Function ดึงข้อมูลจาก Database
$data = getDataFromDatabase($id);
if ($data === null) {
throw new Exception("ไม่พบข้อมูลสำหรับ ID: " . $id);
}
echo json_encode([
'status' => 'success',
'data' => $data
]);
} catch (Exception $e) {
// สร้าง Error Response
http_response_code(400); // Bad Request
echo json_encode([
'status' => 'error',
'message' => $e->getMessage()
]);
}
function getDataFromDatabase($id) {
// จำลองการดึงข้อมูลจาก Database
if ($id == 1) {
return ['name' => 'Product 1', 'price' => 100];
} else {
return null; // ไม่พบข้อมูล
}
}
?>
คำอธิบาย:
header('Content-Type: application/json');: กำหนดว่า Response ที่ส่งออกไปจะเป็น JSONhttp_response_code(400);: กำหนด HTTP Status Code เป็น 400 (Bad Request) ซึ่งหมายถึง Client ส่ง Request ที่ไม่ถูกต้องjson_encode([...]): สร้าง JSON String จาก Array ที่มีข้อมูล Error$e->getMessage(): ดึงข้อความ Error จาก Exception Object
HTTP Status Codes สำหรับ Error ที่ควรรู้
HTTP Status Codes เป็นส่วนสำคัญในการสื่อสาร Error ให้กับ Client การเลือก Status Code ที่ถูกต้องจะช่วยให้ Client เข้าใจปัญหาได้ง่ายขึ้น
- 400 Bad Request: Client ส่ง Request ที่ไม่ถูกต้อง เช่น ข้อมูลไม่ครบถ้วน, รูปแบบข้อมูลไม่ถูกต้อง
- 401 Unauthorized: Client ไม่ได้รับอนุญาตให้เข้าถึง Resource นี้ (ไม่มี Authentication)
- 403 Forbidden: Client ไม่ได้รับอนุญาตให้เข้าถึง Resource นี้ (มี Authentication แต่ไม่มีสิทธิ์)
- 404 Not Found: ไม่พบ Resource ที่ระบุ
- 500 Internal Server Error: เกิด Error ภายใน Server (โดยทั่วไปควรหลีกเลี่ยงการส่ง Status Code นี้โดยตรง ควร Log Error เพื่อตรวจสอบ)
- 503 Service Unavailable: Server ไม่พร้อมให้บริการชั่วคราว
ตัวอย่างการใช้งาน HTTP Status Codes:
<?php
header('Content-Type: application/json');
try {
$productId = $_GET['product_id'];
// ตรวจสอบว่า product_id เป็นตัวเลขหรือไม่
if (!is_numeric($productId)) {
http_response_code(400); // Bad Request
echo json_encode(['status' => 'error', 'message' => 'product_id ต้องเป็นตัวเลข']);
exit;
}
$product = getProduct($productId);
// ตรวจสอบว่าพบ Product หรือไม่
if (!$product) {
http_response_code(404); // Not Found
echo json_encode(['status' => 'error', 'message' => 'ไม่พบ Product ที่มี ID: ' . $productId]);
exit;
}
echo json_encode(['status' => 'success', 'product' => $product]);
} catch (Exception $e) {
http_response_code(500); // Internal Server Error
echo json_encode(['status' => 'error', 'message' => 'เกิดข้อผิดพลาดภายใน Server: ' . $e->getMessage()]);
// ควร Log Error ที่ Server เพื่อตรวจสอบ
error_log($e->getMessage());
}
function getProduct($productId) {
// จำลองการดึงข้อมูล Product จาก Database
$products = [
1 => ['id' => 1, 'name' => 'Product A', 'price' => 50],
2 => ['id' => 2, 'name' => 'Product B', 'price' => 75]
];
if (isset($products[$productId])) {
return $products[$productId];
} else {
return false;
}
}
?>
สรุป
การจัดการ Error เป็นส่วนสำคัญในการสร้าง API ที่มีคุณภาพ การใช้ try-catch, การสร้าง Error Response ที่มีข้อมูลชัดเจน, และการเลือกใช้ HTTP Status Codes ที่ถูกต้อง จะช่วยให้ Client สามารถเข้าใจและแก้ไขปัญหาได้อย่างมีประสิทธิภาพ ในบทต่อไปเราจะพูดถึง HTTP Status Codes ที่ควรรู้ให้ละเอียดมากยิ่งขึ้น