การจัดการ Error: Custom Exception
ในบทเรียนที่แล้ว เราได้เรียนรู้เกี่ยวกับการจัดการ Error ด้วย try, catch และ finally ซึ่งช่วยให้เราสามารถจัดการกับ Exceptions ที่ PHP เตรียมไว้ให้ได้ อย่างไรก็ตาม ในบางครั้ง เราอาจต้องการสร้าง Exception ของเราเอง เพื่อให้สามารถจัดการกับ Error ที่เฉพาะเจาะจงกับ Application ของเราได้ดียิ่งขึ้น บทเรียนนี้จะพาคุณไปรู้จักกับ Custom Exception ใน PHP
ทำไมต้องสร้าง Custom Exception?
Custom Exception ช่วยให้เรา:
- จำแนกประเภท Error ได้ละเอียดขึ้น: แทนที่จะใช้ Exception ทั่วไป เราสามารถสร้าง Exception ที่สื่อถึง Error ที่เกิดขึ้นได้อย่างชัดเจน เช่น
InvalidEmailExceptionหรือInsufficientFundsException - เพิ่มข้อมูล Error ที่เฉพาะเจาะจง: Custom Exception สามารถมี Properties และ Methods เพิ่มเติม เพื่อเก็บข้อมูลที่เกี่ยวข้องกับ Error นั้นๆ เช่น รหัส Error, ข้อความ Error ที่ละเอียดขึ้น หรือข้อมูลที่เกี่ยวข้องกับ Error นั้น
- จัดการ Error ได้อย่างเฉพาะเจาะจง: เราสามารถใช้
catchเพื่อดักจับ Custom Exception ที่เราสร้างขึ้น และจัดการกับ Error นั้นๆ ได้อย่างเหมาะสม
การสร้าง Custom Exception
การสร้าง Custom Exception ใน PHP นั้นง่ายมาก เพียงแค่สร้าง Class ที่ extends Class Exception ซึ่งเป็น Class พื้นฐานสำหรับ Exception ทั้งหมดใน PHP
<?php
class CustomException extends Exception {
// คุณสมบัติและเมธอดเพิ่มเติม (ถ้ามี)
}
?>
ตัวอย่างข้างต้นแสดงให้เห็นถึงโครงสร้างพื้นฐานของ Custom Exception ที่ง่ายที่สุด เราสามารถเพิ่ม Properties และ Methods เพื่อเก็บข้อมูลเพิ่มเติมเกี่ยวกับ Error ที่เกิดขึ้นได้
การกำหนด Properties และ Methods ให้กับ Custom Exception
สมมติว่าเราต้องการสร้าง Custom Exception สำหรับการจัดการกับ Error ที่เกี่ยวข้องกับการเชื่อมต่อฐานข้อมูล เราสามารถสร้าง Class DatabaseConnectionException ที่มี Properties สำหรับเก็บรายละเอียดเกี่ยวกับการเชื่อมต่อที่ล้มเหลวได้ดังนี้:
<?php
class DatabaseConnectionException extends Exception {
protected $host;
protected $username;
public function __construct($message, $host, $username, $code = 0, Throwable $previous = null) {
$this->host = $host;
$this->username = $username;
// Make sure everything is assigned properly
parent::__construct($message, $code, $previous);
}
public function getHost() {
return $this->host;
}
public function getUsername() {
return $this->username;
}
}
?>
ในตัวอย่างนี้ เราได้เพิ่ม Properties $host และ $username เพื่อเก็บข้อมูล Host และ Username ที่ใช้ในการเชื่อมต่อฐานข้อมูล นอกจากนี้ เรายังสร้าง Constructor ที่รับ Parameter เหล่านี้ และกำหนดค่าให้กับ Properties ของ Class โดยการเรียก parent::__construct() เรายังส่งต่อข้อความ, รหัส, และ Exception ก่อนหน้าไปยัง Constructor ของ Class Exception ซึ่งเป็นสิ่งสำคัญเพื่อให้ Exception ทำงานได้อย่างถูกต้อง
เรายังเพิ่ม Methods getHost() และ getUsername() เพื่อให้สามารถเข้าถึงข้อมูล Host และ Username จากภายนอก Class ได้
การ Throw Custom Exception
เมื่อเราสร้าง Custom Exception ของเราแล้ว เราสามารถ throw Exception นั้นได้เมื่อเกิด Error ที่เกี่ยวข้อง ตัวอย่างเช่น:
<?php
function connectToDatabase($host, $username, $password, $database) {
try {
$connection = new PDO("mysql:host=$host;dbname=$database", $username, $password);
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $connection;
} catch (PDOException $e) {
throw new DatabaseConnectionException("ไม่สามารถเชื่อมต่อกับฐานข้อมูลได้: " . $e->getMessage(), $host, $username, $e->getCode(), $e);
}
}
try {
$connection = connectToDatabase("localhost", "root", "password", "mydatabase");
echo "เชื่อมต่อกับฐานข้อมูลสำเร็จ!";
} catch (DatabaseConnectionException $e) {
echo "เกิดข้อผิดพลาดในการเชื่อมต่อฐานข้อมูล: " . $e->getMessage() . "<br>";
echo "Host: " . $e->getHost() . "<br>";
echo "Username: " . $e->getUsername() . "<br>";
}
?>
ในตัวอย่างนี้ เราได้สร้าง Function connectToDatabase() ที่พยายามเชื่อมต่อกับฐานข้อมูล หากเกิด Exception ในระหว่างการเชื่อมต่อ (PDOException) เราจะ throw Custom Exception DatabaseConnectionException แทน โดยส่งต่อข้อมูล Host และ Username ไปยัง Constructor ของ Exception
จากนั้น เราใช้ try และ catch เพื่อจัดการกับ Exception ที่อาจเกิดขึ้น หากเกิด DatabaseConnectionException เราจะแสดงข้อความ Error พร้อมกับข้อมูล Host และ Username ที่เกี่ยวข้อง
กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย
กรณีใช้งานจริง:
- การตรวจสอบความถูกต้องของข้อมูล: สร้าง Custom Exception สำหรับ Error ที่เกี่ยวข้องกับการตรวจสอบความถูกต้องของข้อมูล เช่น
InvalidEmailException,InvalidPasswordException - การจัดการกับ API: สร้าง Custom Exception สำหรับ Error ที่เกิดขึ้นในการเรียก API เช่น
APIConnectionException,APIRateLimitException - การจัดการกับไฟล์: สร้าง Custom Exception สำหรับ Error ที่เกี่ยวข้องกับการจัดการไฟล์ เช่น
FileNotFoundException,FilePermissionException
ข้อผิดพลาดที่พบบ่อย:
- ลืม
extends Exception: หาก Class ของคุณไม่ได้extends ExceptionPHP จะไม่ถือว่าเป็น Exception และจะไม่สามารถthrowได้ - ไม่ส่งต่อข้อมูลไปยัง
parent::__construct(): การไม่ส่งต่อข้อมูลไปยัง Constructor ของ ClassExceptionอาจทำให้ Exception ทำงานไม่ถูกต้อง - จับ Exception ที่ไม่ถูกต้อง: ตรวจสอบให้แน่ใจว่าคุณกำลังจับ Exception ที่คุณต้องการจัดการ หากคุณจับ Exception ที่ไม่ถูกต้อง โปรแกรมของคุณอาจทำงานผิดพลาด
- ไม่จัดการ Exception: การ
throwException โดยไม่มีการcatchจะทำให้โปรแกรมหยุดทำงาน
สรุป
Custom Exception เป็นเครื่องมือที่มีประโยชน์ในการจัดการกับ Error ที่เฉพาะเจาะจงกับ Application ของเรา ช่วยให้เราสามารถจำแนกประเภท Error ได้ละเอียดขึ้น เพิ่มข้อมูล Error ที่เฉพาะเจาะจง และจัดการกับ Error นั้นๆ ได้อย่างเหมาะสม การสร้าง Custom Exception ใน PHP นั้นง่ายมาก เพียงแค่สร้าง Class ที่ extends Exception และเพิ่ม Properties และ Methods ที่จำเป็น
ในบทต่อไป เราจะเรียนรู้เกี่ยวกับการดีบัก PHP ด้วย error_reporting และ ini_set เพื่อช่วยให้เราค้นหาและแก้ไข Error ในโปรแกรมของเราได้อย่างมีประสิทธิภาพ