บทนำ
ก่อน Version 7 PHP รายงาน Errors ตาม Type ต่างๆ PHP 7 เปลี่ยน Mechanism - โยน Error Exceptions แทน Traditional Error Reporting
ถ้า Error Exceptions ไม่ถูกจับ จะรายงาน Fatal Error เหมือนเดิม PHP Error Hierarchy เริ่มจาก Interface Throwable Predefined Errors (ArithmeticError, AssertionError, CompileError, TypeError) เป็น Classes Implement Throwable Interface Exception ใน PHP 7 ก็ Implement Throwable ด้วย
Throwable Interface
ทำหน้าที่ Base สำหรับ Object ที่ Throw ได้ผ่าน throw Statement รวม Error และ Exception Objects User-defined Class ไม่สามารถ Implement Throwable โดยตรงได้ ต้อง Extend Exception Class แทน
Exception Handling ใน PHP 7
ประกอบด้วย throw, catch, try Statements:
- throw - โยน Exception Object
- try - บล็อกโค้ดที่อาจเกิด Exception
- catch - จับและจัดการ Exception (หลาย Catch ได้)
- finally - รันเสมอ ไม่ว่าจะมี Exception หรือไม่
Flow การทำงาน
- รันโค้ดใน Try Block
- ถ้าไม่มี Exception → รันต่อหลัง Catch Block สุดท้าย
- ถ้ามี Exception → ข้ามโค้ดเหลือใน Try → หา Catch Block ที่ Match Type
- ถ้าไม่มี Catch ที่ Match → Fatal Error: Uncaught Exception
- Finally Block รันเสมอ (หลัง Try หรือหลัง Catch)
Error Hierarchy (PHP 7+)
Throwable
├── Error
│ ├── ArithmeticError
│ │ └── DivisionByZeroError
│ ├── AssertionError
│ ├── CompileError
│ │ └── ParseError
│ └── TypeError
│ └── ArgumentCountError
└── Exception
├── LogicException
└── RuntimeException
การจับ Error vs Exception
<?php
try {
// Code that may throw Error or Exception
} catch (TypeError $e) {
// Handle TypeError (Error hierarchy)
} catch (Exception $e) {
// Handle Exception hierarchy
} catch (Throwable $e) {
// Catch ALL (Error + Exception) - PHP 7+
} finally {
// Cleanup code
}
?>
ข้อสำคัญ
catch (Throwable $e)จับทั้ง Error และ Exception (PHP 7+)catch (Exception $e)จับแค่ Exception Hierarchy (ไม่จับ Error)- User-defined Exceptions ต้อง
extends Exception - ไม่สามารถ
implements Throwableโดยตรงได้ - Error มักเป็น Programming Errors (Bugs) Exception มักเป็น Expected Conditions