Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 dasar OrderException yang mewarisi Exception. 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 class OutOfStockException yang mewarisi OrderException. 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 method getProductName(): string yang mengembalikan nama produk.
  • InvalidQuantityException.php: Buat class InvalidQuantityException yang mewarisi OrderException. Exception ini harus menerima nilai jumlah di constructornya menggunakan promosi constructor sebagai property privat. Panggil constructor induk dengan pesan "Invalid quantity: [quantity]". Tambahkan method getQuantity(): int yang 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 InvalidQuantityException dan cetak "Quantity error: [message] (value: [quantity])" menggunakan pesan exception dan method getQuantity(). Lalu, tangkap OutOfStockException dan cetak "Stock error: [message] (product: [productName])" menggunakan pesan exception dan method getProductName().

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()

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online