Hierarki Exception Kustom
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 67 dari 91.
Meskipun class exception bawaan PHP mencakup skenario umum, aplikasi nyata sering memerlukan jenis error yang lebih spesifik. Membuat hierarki exception kustom memungkinkan kamu mendefinisikan exception yang sesuai dengan domainmu dan menanganinya pada berbagai tingkat kekhususan.
Untuk membuat exception kustom, cukup turunkan class Exception atau salah satu subclass-nya:
<?php
class PaymentException extends Exception {}
class InsufficientFundsException extends PaymentException {
public function __construct(
private float $required,
private float $available
) {
parent::__construct("Need $required but only $available available");
}
public function getShortfall(): float {
return $this->required - $this->available;
}
}
Perhatikan bahwa InsufficientFundsException memperluas PaymentException, bukan langsung Exception. Ini membentuk hierarki yang memungkinkan kamu menangkap semua exception terkait pembayaran dengan satu blok catch, atau menangani exception tertentu secara terpisah.
Exception kustom dapat menyertakan property dan method tambahan yang relevan dengan error. Di sini, getShortfall() memberikan informasi berguna yang tidak dapat diberikan oleh exception umum:
<?php
class Wallet {
public function __construct(private float $balance) {}
public function pay(float $amount): void {
if ($amount > $this->balance) {
throw new InsufficientFundsException($amount, $this->balance);
}
$this->balance -= $amount;
}
}
Hierarki exception yang dirancang dengan baik membuat kodemu lebih mudah dipelihara. Saat menangkap exception, kamu bisa menggunakan cakupan seluas atau sespesifik yang diperlukan, dan object exception itu sendiri membawa konteks bermakna tentang apa yang salah.
Tantangan
MudahMari kita bangun sistem pemrosesan pesanan dengan hierarki exception khusus yang menangani berbagai jenis kegagalan pesanan. Kamu akan membuat exception yang membawa konteks bermakna tentang hal yang salah, sehingga penanganan error menjadi lebih tepat dan informatif.
Kamu akan mengatur kodemu dalam empat file:
OrderException.php: Buat class dasarOrderExceptionyang mewarisiException. Class ini menjadi induk bagi semua exception terkait pesanan, sehingga kamu bisa menangkap masalah pesanan apa pun dengan satu blok catch jika diperlukan.OutOfStockException.php: Buat classOutOfStockExceptionyang mewarisiOrderException. Exception ini harus menerima nama produk dan jumlah yang diminta di constructornya. Gunakan promosi constructor untuk property privat ini. Panggil constructor induk dengan pesan berformat"[productName] is out of stock (requested: [quantity])". Tambahkan methodgetProductName(): stringyang mengembalikan nama produk.InvalidQuantityException.php: Buat classInvalidQuantityExceptionyang mewarisiOrderException. Exception ini harus menerima nilai jumlah di constructornya menggunakan promosi constructor sebagai property privat. Panggil constructor induk dengan pesan"Invalid quantity: [quantity]". Tambahkan methodgetQuantity(): intyang mengembalikan nilai jumlah.main.php: Sertakan ketiga file exception. Kamu akan menerima dua input: nama produk dan jumlah (sebagai string yang perlu dikonversi menjadi integer).Berdasarkan nilai jumlah, lempar exception yang sesuai:
- Jika jumlah kurang dari 1, lempar
InvalidQuantityException - Jika jumlah lebih dari 100, lempar
OutOfStockException(untuk menyimulasikan stok yang tidak mencukupi) - Jika tidak, cetak
"Order placed: [quantity]x [productName]"
Tangkap exception menggunakan hierarki tersebut. Pertama, tangkap
InvalidQuantityExceptiondan cetak"Quantity error: [message] (value: [quantity])"menggunakan pesan exception dan methodgetQuantity(). Lalu, tangkapOutOfStockExceptiondan cetak"Stock error: [message] (product: [productName])"menggunakan pesan exception dan methodgetProductName().- Jika jumlah kurang dari 1, lempar
Hierarki ini memungkinkanmu menangani exception tertentu secara terpisah, sekaligus tetap menyediakan opsi untuk menangkap semua masalah terkait pesanan melalui class dasar OrderException. Method khusus pada setiap exception memberikan konteks yang tidak bisa diberikan oleh exception umum.
Coba sendiri
<?php
// Sertakan semua file exception
require_once 'OrderException.php';
require_once 'OutOfStockException.php';
require_once 'InvalidQuantityException.php';
// Baca input
$productName = trim(fgets(STDIN));
$quantity = intval(trim(fgets(STDIN)));
// TODO: Gunakan try-catch untuk menangani pemrosesan pesanan
// Di dalam blok try:
// - Jika quantity < 1, lempar InvalidQuantityException
// - Jika quantity > 100, lempar OutOfStockException
// - Jika tidak, cetak "Order placed: [quantity]x [productName]"
//
// Tangkap InvalidQuantityException terlebih dahulu:
// - Cetak "Quantity error: [message] (value: [quantity])" menggunakan getMessage() dan getQuantity()
//
// Tangkap OutOfStockException:
// - Cetak "Stock error: [message] (product: [productName])" menggunakan getMessage() dan getProductName()
?>Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengenalan OOPclass vs objectKata Kunci $thismethodpropertyConstructor (__construct)Destructor (__destruct)Ringkasan: Kalkulator Sederhana4Pewarisan
Pewarisan DasarKata Kunci parent::Penimpaan methodKata Kunci finalClass AbstrakRingkasan: Hierarki Karyawan7Enkapsulasi
Public, Protected, PrivateModifier Akses secara MendalamGetter dan SetterPenyembunyian InformasiPromosi Constructor (8.0)Ulasan: Sistem Catatan Siswa2Namespace dan Autoloading
Pengenalan NamespaceKata Kunci useStandar Autoloading PSR-4Autoloader ComposerRingkasan: Proyek yang Terorganisasi5Interface dan Kontrak
Pengenalan InterfaceMengimplementasikan InterfaceImplementasi Beberapa InterfaceInterface vs Abstract ClassPetunjuk Tipe dengan InterfaceRekap: Kalkulator Bentuk8Magic Methods
Pengantar Magic Methods__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Cloning Object__serialize & __unserializeRingkasan: Koleksi Kustom11Sistem Tipe Data dan Penanganan Error
Deklarasi TipeTipe NullableTipe Union dan IntersectionClass ExceptionHierarki Exception KustomTry, Catch, FinallyRekap: Validator Form3Property dalam class
Property instance vs staticKonstanta dalam classMethod & property staticProperty private & protectedProperty readonly (PHP 8.1)Ulasan: Pengelola Rekening Bank6Polimorfisme
Meninjau Kembali Method OverridingPolimorfisme melalui AntarmukaPetunjuk Tipe dan Tipe UnionPengikatan Statis TertundaRangkuman: Pemroses PembayaranLatihan sendiri: Compiler PHP online