Menu
CoddyTech

Class Exception

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 66 dari 91.

Di PHP, exception adalah object yang digunakan untuk menandakan bahwa terjadi kesalahan saat program dijalankan. Class dasar untuk semua exception adalah Exception, dan memahami strukturnya membantumu menangani error secara efektif dalam aplikasi OOP-mu.

Saat kamu melempar exception, kamu membuat instance dari class Exception (atau subclass) dengan pesan yang menjelaskan apa yang salah:

<?php
class BankAccount {
    public function __construct(private float $balance = 0) {}
    
    public function withdraw(float $amount): float {
        if ($amount > $this->balance) {
            throw new Exception("Insufficient funds");
        }
        $this->balance -= $amount;
        return $amount;
    }
}

$account = new BankAccount(100);
$account->withdraw(150);

Ini akan menghasilkan error exception yang tidak tertangani dengan pesan "Insufficient funds".

PHP menyediakan beberapa class exception bawaan untuk berbagai situasi. InvalidArgumentException menandakan input yang tidak valid, RuntimeException menunjukkan error saat eksekusi, dan LogicException mewakili error pemrograman:

<?php
class Calculator {
    public function divide(int $a, int $b): float {
        if ($b === 0) {
            throw new InvalidArgumentException("Cannot divide by zero");
        }
        return $a / $b;
    }
}

Setiap object exception membawa informasi yang berguna: getMessage() mengembalikan pesan error, getCode() mengembalikan kode error opsional, getFile() dan getLine() memberi tahu kamu di mana exception dilempar. Menggunakan tipe exception yang spesifik membuat maksud kodemu lebih jelas dan memungkinkan penanganan error yang lebih tepat.

challenge icon

Tantangan

Mudah

Mari bangun sistem manajemen inventaris yang menggunakan class exception bawaan PHP untuk menandakan berbagai jenis masalah. Kamu akan membuat inventaris produk yang operasinya dapat gagal dengan cara yang spesifik dan bermakna.

Kamu akan mengatur kodemu dalam tiga file:

  • Product.php: Buat class Product yang merepresentasikan item dalam inventaris. Gunakan promosi konstruktor untuk $sku bertipe string yang bersifat publik, $name bertipe string yang bersifat publik, dan $quantity bertipe int yang bersifat privat. Class-mu harus memiliki:
    • Method getQuantity(): int yang mengembalikan jumlah saat ini
    • Method addStock(int $amount): void yang menambah jumlah. Jika jumlahnya kurang dari 1, lempar InvalidArgumentException dengan pesan "Amount must be positive"
    • Method removeStock(int $amount): void yang mengurangi jumlah. Jika jumlahnya kurang dari 1, lempar InvalidArgumentException dengan pesan "Amount must be positive". Jika jumlahnya melebihi jumlah saat ini, lempar RuntimeException dengan pesan "Insufficient stock"
  • Inventory.php: Buat class Inventory yang mengelola kumpulan produk. Sertakan file Product. Class-mu harus memiliki:
    • Array privat untuk menyimpan produk dengan indeks SKU
    • Method addProduct(Product $product): void yang menambahkan produk. Jika produk dengan SKU yang sama sudah ada, lempar LogicException dengan pesan "Product already exists: [sku]"
    • Method getProduct(string $sku): Product yang mengembalikan produk berdasarkan SKU. Jika tidak ditemukan, lempar InvalidArgumentException dengan pesan "Product not found: [sku]"
  • main.php: Sertakan file Inventory. Kamu akan menerima tiga input: SKU, nama produk, dan operasi ("add", "remove", atau "duplicate").

    Buat Inventory dan tambahkan Product baru dengan SKU dan nama yang diberikan, serta jumlah awal 10.

    Berdasarkan operasinya:

    • "add": Panggil addStock(5) pada produk, lalu cetak "Stock updated: [quantity]"
    • "remove": Panggil removeStock(15) pada produk (ini seharusnya melempar exception)
    • "duplicate": Coba tambahkan produk lain dengan SKU yang sama (ini seharusnya melempar exception)

    Saat exception dilempar, cetak nama class exception, lalu ": " dan pesan exception. Gunakan fungsi get_class() dari PHP untuk mendapatkan nama class.

Tantangan ini menunjukkan cara berbagai jenis exception menyampaikan berbagai macam masalah, yaitu input tidak valid, kegagalan saat runtime, dan error logika. Dengan begitu, penanganan error dalam kodemu menjadi lebih tepat dan bermakna.

Coba sendiri

<?php

require_once 'Inventory.php';

// Baca input
$sku = trim(fgets(STDIN));
$name = trim(fgets(STDIN));
$operation = trim(fgets(STDIN));

try {
    // TODO: Buat Inventory
    // TODO: Buat Product dengan SKU dan nama yang diberikan, serta jumlah awal 10
    // TODO: Tambahkan produk ke inventaris
    
    // TODO: Berdasarkan operasi:
    // - "add": Panggil addStock(5) pada produk, lalu cetak "Stock updated: [quantity]"
    // - "remove": Panggil removeStock(15) pada produk
    // - "duplicate": Coba tambahkan produk lain dengan SKU yang sama
    
} catch (Exception $e) {
    // TODO: Cetak nama class exception, diikuti oleh ": " dan pesannya
    // Petunjuk: Gunakan get_class($e) untuk mendapatkan nama class
}

?>
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