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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชนิดและการรายงานข้อผิดพลาดใน PHP
- Try, Catch และ Finally
- การสร้างข้อยกเว้นแบบกำหนดเอง
- การบันทึกข้อผิดพลาดและแนวทางปฏิบัติที่ดี