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.
Tantangan
MudahMari 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 classProductyang merepresentasikan item dalam inventaris. Gunakan promosi konstruktor untuk$skubertipe string yang bersifat publik,$namebertipe string yang bersifat publik, dan$quantitybertipe int yang bersifat privat. Class-mu harus memiliki:- Method
getQuantity(): intyang mengembalikan jumlah saat ini - Method
addStock(int $amount): voidyang menambah jumlah. Jika jumlahnya kurang dari 1, lemparInvalidArgumentExceptiondengan pesan"Amount must be positive" - Method
removeStock(int $amount): voidyang mengurangi jumlah. Jika jumlahnya kurang dari 1, lemparInvalidArgumentExceptiondengan pesan"Amount must be positive". Jika jumlahnya melebihi jumlah saat ini, lemparRuntimeExceptiondengan pesan"Insufficient stock"
- Method
Inventory.php: Buat classInventoryyang mengelola kumpulan produk. Sertakan file Product. Class-mu harus memiliki:- Array privat untuk menyimpan produk dengan indeks SKU
- Method
addProduct(Product $product): voidyang menambahkan produk. Jika produk dengan SKU yang sama sudah ada, lemparLogicExceptiondengan pesan"Product already exists: [sku]" - Method
getProduct(string $sku): Productyang mengembalikan produk berdasarkan SKU. Jika tidak ditemukan, lemparInvalidArgumentExceptiondengan 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
Inventorydan tambahkanProductbaru dengan SKU dan nama yang diberikan, serta jumlah awal10.Berdasarkan operasinya:
"add": PanggiladdStock(5)pada produk, lalu cetak"Stock updated: [quantity]""remove": PanggilremoveStock(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 fungsiget_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
}
?>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