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

Try, Catch และ Finally

จัดการข้อยกเว้นขณะทำงานอย่างเหมาะสมด้วยบล็อก try/catch/finally

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

ข้อยกเว้นเทียบกับข้อผิดพลาด

PHP มีสองวิธีในการส่งสัญญาณปัญหา:

  • ข้อผิดพลาด — การแจ้งให้ทราบ คำเตือน และข้อผิดพลาดร้ายแรงแบบดั้งเดิมของ PHP (กล่าวถึงในบทเรียนก่อนหน้า)
  • ข้อยกเว้น — ออบเจ็กต์ที่ถูกโยนเมื่อเกิดเหตุการณ์ผิดปกติ และดักจับด้วย try/catch

ข้อยกเว้นเป็นแนวทางสมัยใหม่และเป็นแนวทางที่แนะนำสำหรับการจัดการข้อผิดพลาดที่กู้คืนได้

การโยนข้อยกเว้น

ใช้ throw เพื่อส่งสัญญาณว่ามีบางอย่างผิดพลาด:

<?php
function divide(float $a, float $b): float {
    if ($b == 0) {
        throw new InvalidArgumentException('Cannot divide by zero');
    }
    return $a / $b;
}

echo divide(10, 2);   // 5
// divide(10, 0);     // throws exception

บล็อก try / catch

ครอบโค้ดที่อาจโยนข้อยกเว้นไว้ใน try และจัดการข้อยกเว้นใน catch:

<?php
try {
    $result = divide(10, 0);
    echo $result;
} catch (InvalidArgumentException $e) {
    echo 'Error: ' . $e->getMessage();
    echo ' in ' . $e->getFile() . ':' . $e->getLine();
}

บล็อก catch หลายรายการ

ดักจับประเภทข้อยกเว้นที่แตกต่างกันในบล็อก catch แยกกัน:

<?php
try {
    $pdo = new PDO($dsn, $user, $pass);
    $result = performQuery($pdo);
} catch (PDOException $e) {
    error_log('DB error: ' . $e->getMessage());
    echo 'Database unavailable';
} catch (RuntimeException $e) {
    echo 'Runtime error: ' . $e->getMessage();
} catch (\Throwable $e) {
    echo 'Unexpected error: ' . $e->getMessage();
}

บล็อก finally

finally จะทำงานไม่ว่าจะมีการโยนข้อยกเว้นหรือไม่ — เหมาะอย่างยิ่งสำหรับการทำความสะอาดทรัพยากร:

<?php
$connection = null;
try {
    $connection = openDatabaseConnection();
    $data = fetchData($connection);
} catch (DatabaseException $e) {
    error_log($e->getMessage());
    echo 'DB error';
} finally {
    // Always runs — even if exception was thrown
    if ($connection) {
        closeConnection($connection);
    }
}

ลำดับชั้นของข้อยกเว้น

ลำดับชั้นคลาสข้อยกเว้นของ PHP:

  • Throwable (อินเทอร์เฟซ)
  • ├─ Error — ข้อผิดพลาดจากเอนจิน PHP (TypeError, ParseError…)
  • └─ Exception — ข้อยกเว้นของแอปพลิเคชัน
  • ├─ RuntimeException
  • ├─ InvalidArgumentException
  • ├─ LogicException
  • └─ PDOException

การดักจับ Throwable

ดักจับทั้งข้อยกเว้นและข้อผิดพลาดของ PHP ด้วย Throwable:

<?php
try {
    $result = someFunction();
} catch (\Exception $e) {
    echo 'Exception: ' . $e->getMessage();
} catch (\Error $e) {
    echo 'PHP Error: ' . $e->getMessage();
}

// Or catch both at once:
try {
    // ...
} catch (\Throwable $e) {
    echo get_class($e) . ': ' . $e->getMessage();
}

การดักจับแบบยูเนียน (PHP 8)

PHP 8 อนุญาตให้ดักจับข้อยกเว้นหลายประเภทในบล็อก catch เดียว:

<?php
try {
    processRequest();
} catch (InvalidArgumentException | RuntimeException $e) {
    echo 'Handled: ' . $e->getMessage();
}

// Compare PHP 7 approach:
// catch (InvalidArgumentException $e) { ... }
// catch (RuntimeException $e) { ... }

การโยนข้อยกเว้นซ้ำ

ดักจับ บันทึก และโยนข้อยกเว้นซ้ำเพื่อส่งต่อขึ้นไปตามลำดับการเรียก:

<?php
function processOrder(int $id): void {
    try {
        $order = loadOrder($id);
        $order->process();
    } catch (PaymentException $e) {
        error_log('Payment failed for order ' . $id . ': ' . $e->getMessage());
        throw $e;  // re-throw after logging
    }
}

การเชื่อมโยงข้อยกเว้น

ส่งข้อยกเว้นต้นฉบับเป็นข้อยกเว้นก่อนหน้าเพื่อรักษาบริบทไว้:

<?php
try {
    $data = fetchFromAPI();
} catch (NetworkException $e) {
    throw new ServiceUnavailableException(
        'Cannot reach upstream service',
        0,
        $e  // $previous — preserves original cause
    );
}

// Retrieve original:
// $e->getPrevious()

set_exception_handler

ลงทะเบียนตัวจัดการข้อยกเว้นส่วนกลางสำหรับข้อยกเว้นที่ไม่ได้ถูกดักจับ:

<?php
set_exception_handler(function(\Throwable $e): void {
    error_log(sprintf(
        '[UNCAUGHT] %s: %s in %s:%d',
        get_class($e),
        $e->getMessage(),
        $e->getFile(),
        $e->getLine()
    ));
    http_response_code(500);
    echo 'An unexpected error occurred. Please try again.';
    exit(1);
});

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

ใน try/catch/finally บล็อกใดรับประกันว่าจะทำงานไม่ว่าจะมีการโยนข้อยกเว้นหรือไม่?

สรุป: try/catch/finally

สรุปการจัดการข้อยกเว้น:

  • โยนข้อยกเว้นด้วย throw new ExceptionClass()
  • ดักจับด้วย catch (Type $e)
  • ใช้บล็อก catch หลายรายการสำหรับประเภทที่แตกต่างกัน
  • finally ทำงานเสมอ — ใช้สำหรับการทำความสะอาดทรัพยากร
  • การดักจับแบบยูเนียนใน PHP 8: catch (A | B $e)
  • โยนข้อยกเว้นซ้ำเพื่อรักษาบริบทของลำดับการเรียก

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

บทเรียน “Try, Catch และ Finally” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Try, Catch และ Finally”

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

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

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

บทเรียน “Try, Catch และ Finally” ใช้เวลานานแค่ไหน

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

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

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

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

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