Selamat datang di part 38 dari seri tutorial pemrograman PHP Zero to Hero! Di bagian ini, kita akan membahas tentang Advanced Error Handling dengan menggunakan Custom Exception. Error handling yang baik sangat penting untuk membuat aplikasi yang robust dan mudah di-debug. Kita akan belajar bagaimana membuat exception sendiri untuk menangani kasus-kasus spesifik dalam aplikasi kita.
Prasyarat: Pastikan Anda sudah familiar dengan konsep dasar exception di PHP, seperti blok try-catch, dan sedikit mengerti tentang PHP Generators yang sudah kita bahas pada Part 37: 'PHP Generators - Memori Efisien dengan Iterasi Tanpa Batas'. Kita akan membangun error handling yang lebih spesifik dari dasar-dasar exception.
Bayangkan sebuah pabrik yang memproduksi barang. Jika ada kesalahan dalam proses produksi (misalnya, bahan baku tidak mencukupi), pabrik tersebut akan mengeluarkan sinyal 'error' agar masalah tersebut dapat diatasi. Dalam pemrograman, exception adalah sinyal 'error' ini. Custom Exception memungkinkan kita membuat sinyal error spesifik untuk situasi-situasi yang mungkin terjadi dalam kode kita yang tidak ditangani oleh exception bawaan PHP.
Dengan membuat Custom Exception, kita dapat memberikan informasi lebih detail tentang kesalahan yang terjadi, sehingga memudahkan proses debugging dan penanganan error yang lebih efektif. Ini seperti memberikan label yang jelas pada setiap jenis kesalahan di pabrik.
Mari kita buat contoh kode untuk memahami Custom Exception.
<?php
// Membuat Custom Exception
class InvalidInputException extends Exception {
public function __construct($message = "Input tidak valid", $code = 0, Throwable $previous = null) {
parent::__construct($message, $code, $previous);
}
public function __toString() {
return __CLASS__ . ": [" . $this->code . "]: " . $this->message . "\n";
}
}
// Fungsi yang melempar Exception
function validateInput($input) {
if (!is_numeric($input) || $input <= 0) {
throw new InvalidInputException("Input harus berupa angka positif.", 101);
}
return $input;
}
// Penggunaan try-catch
try {
$result = validateInput(-5);
echo "Hasil: " . $result . "\n";
} catch (InvalidInputException $e) {
echo "Terjadi kesalahan: " . $e->getMessage() . "\n";
echo "Kode kesalahan: " . $e->getCode() . "\n";
}
// Contoh Input yang Valid
try {
$result = validateInput(10);
echo "Hasil: " . $result . "\n";
} catch (InvalidInputException $e) {
echo "Terjadi kesalahan: " . $e->getMessage() . "\n";
echo "Kode kesalahan: " . $e->getCode() . "\n";
}
?>
Penjelasan Kode:
InvalidInputException yang extends dari class Exception.Exception) untuk mengatur message, code, dan previous exception.validateInput akan melempar InvalidInputException jika input tidak valid (bukan angka atau kurang dari atau sama dengan 0).try-catch digunakan untuk menangkap exception dan menanganinya.
<?php
// Base Exception
class AppException extends Exception {
// ... Common functionality
}
// Specific Exception
class DatabaseException extends AppException {
// ... Specific DB related functionality
}
class UserNotFoundException extends DatabaseException {
public function __construct($message = "User tidak ditemukan.", $code = 201, Throwable $previous = null) {
parent::__construct($message, $code, $previous);
}
}
function getUser($userId) {
if ($userId != 123) {
throw new UserNotFoundException();
}
return "User Found";
}
try {
$user = getUser(456);
echo $user;
} catch (UserNotFoundException $e) {
echo "Error: ". $e->getMessage();
}
?>
die() atau exit() untuk menangani error. Gunakan exception untuk pemisahan concern yang lebih baik.Exception tanpa mengetahui jenis exception yang mungkin terjadi. Tangkap exception spesifik untuk penanganan yang lebih baik.Buatlah sebuah Custom Exception untuk menangani kasus ketika sebuah file tidak ditemukan. Buat fungsi yang mencoba membaca file, dan lempar exception jika file tidak ada. Tangkap exception tersebut dan tampilkan pesan error yang informatif.