Try, Catch, Finally
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 68 dari 91.
Sekarang setelah kamu tahu cara membuat dan melempar exception, kamu perlu belajar cara menangkap exception tersebut. Struktur try-catch-finally memungkinkan kamu menangani exception dengan baik, alih-alih membiarkannya membuat aplikasimu crash.
Bungkus kode yang mungkin memunculkan exception dalam blok try, lalu tangani exception tersebut dalam blok catch:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
$calc = new Calculator();
try {
echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
}
Output:
Error: Cannot divide by zeroKamu dapat menangani berbagai tipe exception dengan beberapa blok catch. PHP memeriksanya secara berurutan, jadi tempatkan exception yang lebih spesifik terlebih dahulu:
<?php
try {
// kode berisiko
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
Blok finally dijalankan terlepas dari apakah exception dilempar atau ditangkap. Blok ini cocok untuk tugas pembersihan, seperti menutup koneksi:
<?php
try {
echo "Attempting operation\n";
throw new Exception("Failed");
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup complete";
}
Output:
Attempting operation
Caught: Failed
Cleanup completeBlok finally tetap dijalankan meskipun kamu melakukan return dari dalam blok try atau catch, sehingga dapat diandalkan untuk operasi pembersihan penting.
Tantangan
MudahMari kita buat sistem pemrosesan file yang menunjukkan cara try-catch-finally bekerja sama untuk menangani error dengan baik sekaligus memastikan pembersihan selalu dilakukan.
Kamu akan mengatur kodemu dalam tiga file:
FileException.php: Buat classFileExceptionkhusus yang mewarisiException. Class ini akan mewakili error terkait file dalam sistemmu.FileProcessor.php: Buat classFileProcessoryang menyimulasikan operasi file. Sertakan file FileException. Class-mu harus memiliki:- Property boolean privat
$isOpenyang diinisialisasi denganfalse - Method
open(string $filename): voidyang mengatur$isOpenmenjaditruedan mencetak"Opening: [filename]". Jika nama file adalah"invalid.txt", lemparFileExceptiondengan pesan"Cannot open file" - Method
process(): voidyang mencetak"Processing file...". Jika$isOpenadalahfalse, lemparRuntimeExceptiondengan pesan"File not open" - Method
close(): voidyang mengatur$isOpenmenjadifalsedan mencetak"File closed" - Method
isOpen(): boolyang mengembalikan status saat ini
- Property boolean privat
main.php: Sertakan file FileProcessor. Kamu akan menerima satu input: nama file.Buat
FileProcessordan gunakan strukturtry-catch-finallyuntuk:- Di blok
try: panggilopen()dengan nama file, lalu panggilprocess() - Tangkap
FileExceptionterlebih dahulu dan cetak"File error: [message]" - Tangkap
RuntimeExceptiondan cetak"Runtime error: [message]" - Di blok
finally: periksa apakah file terbuka menggunakanisOpen(), lalu jika ya, panggilclose(). Setelah itu, cetak"Cleanup complete"
- Di blok
Blok finally memastikan bahwa pembersihan dilakukan baik operasi berhasil maupun gagal. Pola ini penting untuk mengelola sumber daya seperti file, koneksi database, atau soket jaringan yang harus dibersihkan terlepas dari apa yang terjadi selama pemrosesan.
Coba sendiri
<?php
require_once 'FileProcessor.php';
// Baca input
$filename = trim(fgets(STDIN));
// TODO: Buat instance FileProcessor
// TODO: Gunakan struktur try-catch-finally:
// - Di blok try: panggil open() dengan filename, lalu panggil process()
// - Tangkap FileException terlebih dahulu dan cetak "File error: [message]"
// - Tangkap RuntimeException dan cetak "Runtime error: [message]"
// - Di blok finally: periksa apakah file terbuka menggunakan isOpen(), jika ya, panggil close()
// Lalu cetak "Cleanup complete"
?>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