0Pricing
PHP Academy · บทเรียน

การสร้างข้อยกเว้นแบบกำหนดเอง

สืบทอดจากคลาส Exception เพื่อสร้างชนิดข้อผิดพลาดเฉพาะโดเมน

การสร้างข้อยกเว้นแบบกำหนดเอง เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงต้องใช้ข้อยกเว้นแบบกำหนดเอง

ข้อยกเว้นแบบกำหนดเองช่วยให้คุณสามารถ:

  • แยกข้อผิดพลาดของแอปพลิเคชันออกจากข้อผิดพลาดทั่วไปของ PHP
  • เก็บข้อมูลเฉพาะโดเมน เช่น ID คำสั่งซื้อ ID ผู้ใช้ เป็นต้น
  • ดักจับประเภทข้อผิดพลาดเฉพาะในแต่ละชั้น
  • สร้างลำดับชั้นข้อผิดพลาดที่มีความหมายและอธิบายตัวเองได้

การสืบทอดจาก Exception

สร้างข้อยกเว้นแบบกำหนดเองโดยสืบทอดจากคลาสพื้นฐาน Exception:

<?php
class ValidationException extends \Exception
{
    private array $errors;

    public function __construct(array $errors, string $message = '', int $code = 0)
    {
        $this->errors = $errors;
        parent::__construct($message ?: implode(', ', $errors), $code);
    }

    public function getErrors(): array
    {
        return $this->errors;
    }
}

การใช้ข้อยกเว้นแบบกำหนดเอง

โยนและดักจับข้อยกเว้นแบบกำหนดเองของคุณ:

<?php
function createUser(array $data): void {
    $errors = [];
    if (empty($data['email'])) $errors[] = 'Email required';
    if (empty($data['name']))  $errors[] = 'Name required';

    if ($errors) {
        throw new ValidationException($errors);
    }
    // save user...
}

try {
    createUser([]);
} catch (ValidationException $e) {
    foreach ($e->getErrors() as $err) {
        echo '- ' . $err . PHP_EOL;
    }
}

การออกแบบลำดับชั้นข้อยกเว้น

ออกแบบลำดับชั้นสำหรับโดเมนของคุณ:

<?php
// Base exception for your app
class AppException extends \RuntimeException {}

// Domain-specific exceptions
class NotFoundException extends AppException {}
class AuthException extends AppException {}
class PaymentException extends AppException {}

// Specific payment errors
class InsufficientFundsException extends PaymentException {
    public function __construct(public readonly float $balance, public readonly float $required) {
        parent::__construct("Insufficient funds: have $balance, need $required");
    }
}

การดักจับตามลำดับชั้น

ดักจับคลาสพื้นฐานเพื่อจัดการข้อยกเว้นที่สืบทอดมาทั้งหมด:

<?php
try {
    processPayment($order);
} catch (InsufficientFundsException $e) {
    echo 'Low balance: need ' . $e->required;
} catch (PaymentException $e) {
    echo 'Payment failed: ' . $e->getMessage();
} catch (AppException $e) {
    echo 'App error: ' . $e->getMessage();
} catch (\Throwable $e) {
    // Last resort
    error_log($e);
}

การเพิ่มบริบทให้ข้อยกเว้น

เพิ่มข้อมูลเพิ่มเติมให้ข้อยกเว้นเพื่อช่วยในการแก้จุดบกพร่อง:

<?php
class HttpException extends \RuntimeException
{
    public function __construct(
        private int    $statusCode,
        string         $message = '',
        ?\Throwable    $previous = null
    ) {
        parent::__construct($message, $statusCode, $previous);
    }

    public function getStatusCode(): int
    {
        return $this->statusCode;
    }
}

ตัวอย่างข้อยกเว้น HTTP

การใช้ข้อยกเว้น HTTP ในแอปพลิเคชันเว็บ:

<?php
try {
    $user = findUserById($id);
    if (!$user) throw new HttpException(404, 'User not found');
    if (!$user->canAccess($resource)) {
        throw new HttpException(403, 'Access denied');
    }
} catch (HttpException $e) {
    http_response_code($e->getStatusCode());
    echo json_encode(['error' => $e->getMessage()]);
}

ข้อยกเว้นตามอินเทอร์เฟซ

ใช้อินเทอร์เฟซเพื่อจัดกลุ่มคลาสข้อยกเว้นที่ไม่เกี่ยวข้องกัน:

<?php
interface UserFacingException
{
    public function getUserMessage(): string;
}

class ValidationException extends \Exception implements UserFacingException
{
    public function getUserMessage(): string
    {
        return 'Please check your input: ' . $this->getMessage();
    }
}

// In controller:
catch (UserFacingException $e) {
    echo $e->getUserMessage();
}

รูปแบบตัวสร้างที่มีชื่อ

ใช้เมธอดโรงงานแบบคงที่สำหรับสถานการณ์ข้อยกเว้นทั่วไป:

<?php
class OrderException extends \RuntimeException
{
    public static function notFound(int $id): self
    {
        return new self("Order #$id not found", 404);
    }

    public static function alreadyShipped(int $id): self
    {
        return new self("Order #$id already shipped", 409);
    }
}

throw OrderException::notFound($orderId);

การทำให้ข้อยกเว้นเป็นอนุกรม

แปลงข้อมูลข้อยกเว้นเป็นอาร์เรย์สำหรับการบันทึกหรือการตอบกลับ API:

<?php
function exceptionToArray(\Throwable $e): array {
    return [
        'type'    => get_class($e),
        'message' => $e->getMessage(),
        'code'    => $e->getCode(),
        'file'    => $e->getFile(),
        'line'    => $e->getLine(),
        'trace'   => $e->getTraceAsString(),
        'previous' => $e->getPrevious()
            ? exceptionToArray($e->getPrevious())
            : null,
    ];
}

แนวปฏิบัติที่ดีสำหรับข้อยกเว้นแบบกำหนดเอง

แนวทางในการออกแบบข้อยกเว้นแบบกำหนดเอง:

  • สืบทอดจาก RuntimeException สำหรับเงื่อนไขที่ไม่คาดคิด
  • สืบทอดจาก LogicException สำหรับข้อผิดพลาดของโปรแกรมเมอร์ (อาร์กิวเมนต์ไม่ถูกต้อง)
  • อย่าสร้างคลาสข้อยกเว้นสำหรับทุกข้อความที่เป็นไปได้ — ใช้รหัสแทน
  • ตั้งชื่อคลาสข้อยกเว้นเป็น PascalCase และลงท้ายด้วย Exception
  • ระบุว่าแต่ละเมธอดสามารถโยนข้อยกเว้นใดได้บ้าง

ตรวจสอบอย่างรวดเร็ว

ควรสืบทอดจากคลาสพื้นฐานใดของ PHP เพื่อสร้างข้อยกเว้นแบบกำหนดเองที่แสดงถึงข้อผิดพลาดเชิงตรรกะในโค้ดของคุณ?

สรุป: ข้อยกเว้นแบบกำหนดเอง

สรุปข้อยกเว้นแบบกำหนดเอง:

  • สืบทอดจาก Exception หรือคลาสย่อย
  • เพิ่มคุณสมบัติและเมธอดเฉพาะโดเมน
  • ออกแบบลำดับชั้น — ดักจับคลาสแม่เพื่อดักจับคลาสลูกทั้งหมด
  • ใช้อินเทอร์เฟซเพื่อจัดกลุ่มข้อยกเว้นที่ไม่เกี่ยวข้องกัน
  • ใช้ตัวสร้างแบบคงที่ที่มีชื่อเพื่อความชัดเจน
  • เรียกใช้ parent::__construct() เสมอ

คำถามที่พบบ่อย

บทเรียน “การสร้างข้อยกเว้นแบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างข้อยกเว้นแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างข้อยกเว้นแบบกำหนดเอง”

สืบทอดจากคลาส Exception เพื่อสร้างชนิดข้อผิดพลาดเฉพาะโดเมน คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างข้อยกเว้นแบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม

ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชนิดและการรายงานข้อผิดพลาดใน PHP
  2. Try, Catch และ Finally
  3. การสร้างข้อยกเว้นแบบกำหนดเอง
  4. การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี
← กลับไปที่ PHP Academy