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