Menu
CoddyTech

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 zero

Kamu 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 complete

Blok finally tetap dijalankan meskipun kamu melakukan return dari dalam blok try atau catch, sehingga dapat diandalkan untuk operasi pembersihan penting.

challenge icon

Tantangan

Mudah

Mari 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 class FileException khusus yang mewarisi Exception. Class ini akan mewakili error terkait file dalam sistemmu.
  • FileProcessor.php: Buat class FileProcessor yang menyimulasikan operasi file. Sertakan file FileException. Class-mu harus memiliki:
    • Property boolean privat $isOpen yang diinisialisasi dengan false
    • Method open(string $filename): void yang mengatur $isOpen menjadi true dan mencetak "Opening: [filename]". Jika nama file adalah "invalid.txt", lempar FileException dengan pesan "Cannot open file"
    • Method process(): void yang mencetak "Processing file...". Jika $isOpen adalah false, lempar RuntimeException dengan pesan "File not open"
    • Method close(): void yang mengatur $isOpen menjadi false dan mencetak "File closed"
    • Method isOpen(): bool yang mengembalikan status saat ini
  • main.php: Sertakan file FileProcessor. Kamu akan menerima satu input: nama file.

    Buat FileProcessor dan gunakan struktur try-catch-finally untuk:

    • Di blok try: panggil open() dengan nama file, 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(), lalu jika ya, panggil close(). Setelah itu, cetak "Cleanup complete"

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"

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