0Pricing
PHP Academy · Pelajaran

Membuat Pengecualian Kustom

Perluas class Exception untuk membuat jenis error khusus domain.

Membuat Pengecualian Kustom adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.

Mengapa Pengecualian Kustom?

Pengecualian kustom memungkinkan Anda:

  • Membedakan kesalahan aplikasi Anda dari kesalahan PHP umum
  • Membawa data khusus domain (ID pesanan, ID pengguna, dan sebagainya)
  • Menangkap jenis kesalahan tertentu pada lapisan yang berbeda
  • Membuat hierarki kesalahan yang bermakna dan mendokumentasikan dirinya sendiri

Memperluas Exception

Buat pengecualian kustom dengan memperluas kelas dasar Exception:

<?php
class ValidationException extends \Exception
{
    private array $errors;

    public function __construct(array $errors, string $message = '', int $code = 0)
    {
        $this->errors = $errors;
        parent::__construct($message ?: implode(', ', $errors), $code);
    }

    public function getErrors(): array
    {
        return $this->errors;
    }
}

Menggunakan Pengecualian Kustom

Lempar dan tangkap pengecualian kustom Anda:

<?php
function createUser(array $data): void {
    $errors = [];
    if (empty($data['email'])) $errors[] = 'Email required';
    if (empty($data['name']))  $errors[] = 'Name required';

    if ($errors) {
        throw new ValidationException($errors);
    }
    // save user...
}

try {
    createUser([]);
} catch (ValidationException $e) {
    foreach ($e->getErrors() as $err) {
        echo '- ' . $err . PHP_EOL;
    }
}

Desain Hierarki Pengecualian

Rancang hierarki untuk domain Anda:

<?php
// Base exception for your app
class AppException extends \RuntimeException {}

// Domain-specific exceptions
class NotFoundException extends AppException {}
class AuthException extends AppException {}
class PaymentException extends AppException {}

// Specific payment errors
class InsufficientFundsException extends PaymentException {
    public function __construct(public readonly float $balance, public readonly float $required) {
        parent::__construct("Insufficient funds: have $balance, need $required");
    }
}

Menangkap Berdasarkan Hierarki

Tangkap kelas dasar untuk menangani semua pengecualian turunannya:

<?php
try {
    processPayment($order);
} catch (InsufficientFundsException $e) {
    echo 'Low balance: need ' . $e->required;
} catch (PaymentException $e) {
    echo 'Payment failed: ' . $e->getMessage();
} catch (AppException $e) {
    echo 'App error: ' . $e->getMessage();
} catch (\Throwable $e) {
    // Last resort
    error_log($e);
}

Menambahkan Konteks ke Pengecualian

Perkaya pengecualian dengan data tambahan untuk penelusuran kesalahan:

<?php
class HttpException extends \RuntimeException
{
    public function __construct(
        private int    $statusCode,
        string         $message = '',
        ?\Throwable    $previous = null
    ) {
        parent::__construct($message, $statusCode, $previous);
    }

    public function getStatusCode(): int
    {
        return $this->statusCode;
    }
}

Contoh Pengecualian HTTP

Menggunakan pengecualian HTTP dalam aplikasi web:

<?php
try {
    $user = findUserById($id);
    if (!$user) throw new HttpException(404, 'User not found');
    if (!$user->canAccess($resource)) {
        throw new HttpException(403, 'Access denied');
    }
} catch (HttpException $e) {
    http_response_code($e->getStatusCode());
    echo json_encode(['error' => $e->getMessage()]);
}

Pengecualian Berbasis Antarmuka

Gunakan antarmuka untuk mengelompokkan kelas pengecualian yang tidak saling terkait:

<?php
interface UserFacingException
{
    public function getUserMessage(): string;
}

class ValidationException extends \Exception implements UserFacingException
{
    public function getUserMessage(): string
    {
        return 'Please check your input: ' . $this->getMessage();
    }
}

// In controller:
catch (UserFacingException $e) {
    echo $e->getUserMessage();
}

Pola Konstruktor Bernama

Gunakan metode pabrik statis untuk skenario pengecualian umum:

<?php
class OrderException extends \RuntimeException
{
    public static function notFound(int $id): self
    {
        return new self("Order #$id not found", 404);
    }

    public static function alreadyShipped(int $id): self
    {
        return new self("Order #$id already shipped", 409);
    }
}

throw OrderException::notFound($orderId);

Menserialisasi Pengecualian

Konversikan data pengecualian menjadi array untuk pencatatan atau respons API:

<?php
function exceptionToArray(\Throwable $e): array {
    return [
        'type'    => get_class($e),
        'message' => $e->getMessage(),
        'code'    => $e->getCode(),
        'file'    => $e->getFile(),
        'line'    => $e->getLine(),
        'trace'   => $e->getTraceAsString(),
        'previous' => $e->getPrevious()
            ? exceptionToArray($e->getPrevious())
            : null,
    ];
}

Praktik Terbaik untuk Pengecualian Kustom

Panduan untuk merancang pengecualian kustom:

  • Perluas RuntimeException untuk kondisi yang tidak terduga
  • Perluas LogicException untuk kesalahan pemrogram (argumen tidak valid)
  • Jangan membuat kelas pengecualian untuk setiap pesan yang mungkin — gunakan kode sebagai gantinya
  • Gunakan nama kelas pengecualian dalam PascalCase yang diakhiri dengan Exception
  • Dokumentasikan pengecualian yang dapat dilempar oleh setiap metode

Pemeriksaan Singkat

Kelas dasar PHP mana yang harus Anda perluas untuk membuat pengecualian kustom yang mewakili kesalahan logis dalam kode Anda?

Ringkasan: Pengecualian Kustom

Ringkasan pengecualian kustom:

  • Perluas Exception atau turunannya
  • Tambahkan properti dan metode khusus domain
  • Rancang hierarki — tangkap induknya untuk menangkap semua turunannya
  • Gunakan antarmuka untuk mengelompokkan pengecualian yang tidak saling terkait
  • Gunakan konstruktor bernama statis agar lebih jelas
  • Selalu panggil parent::__construct()

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat Pengecualian Kustom” gratis?

Ya — teks lengkap “Membuat Pengecualian Kustom” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membuat Pengecualian Kustom”?

Perluas class Exception untuk membuat jenis error khusus domain. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai PHP Academy?

Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Membuat Pengecualian Kustom” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?

Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Jenis dan Pelaporan Error PHP
  2. Try, Catch, dan Finally
  3. Membuat Pengecualian Kustom
  4. Logging Error dan Praktik Terbaik
← Kembali ke PHP Academy