PHP Academy · Lektion

Skapa egna undantag

Utöka klassen Exception för att skapa domänspecifika feltyper.

Lektion 3 av 413 steg

Skapa egna undantag är en gratis lektion i PHP Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för PHP Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i PHP Academy innehåller totalt 4 lektioner.

Varför anpassade undantag?

Anpassade undantag gör det möjligt att:

  • Skilja applikationens fel från generiska PHP-fel
  • Inkludera domänspecifika data (order-ID, användar-ID med mera)
  • Fånga specifika feltyper på olika lager
  • Skapa meningsfulla och självförklarande felhierarkier

Utöka Exception

Skapa ett anpassat undantag genom att utöka basklassen 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;
    }
}

Använda ett anpassat undantag

Kasta och fånga ett anpassat undantag:

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

Utforma en undantagshierarki

Utforma en hierarki för er domän:

<?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");
    }
}

Fånga efter hierarki

Fånga en basklass för att hantera alla härledda undantag:

<?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);
}

Lägga till kontext i undantag

Berika undantag med ytterligare data för felsökning:

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

Exempel på HTTP-undantag

Använda HTTP-undantaget i en webbapplikation:

<?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()]);
}

Gränssnittsbaserade undantag

Använd gränssnitt för att gruppera obesläktade undantagsklasser:

<?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();
}

Mönstret med namngivna konstruktorer

Använd statiska fabrikmetoder för vanliga undantagssituationer:

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

Serialisera undantag

Konvertera undantagsdata till en array för loggning eller API-svar:

<?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,
    ];
}

Bästa praxis för anpassade undantag

Riktlinjer för att utforma anpassade undantag:

  • Utöka RuntimeException för oväntade situationer
  • Utöka LogicException för programmeringsfel (ogiltiga argument)
  • Skapa inte en undantagsklass för varje möjligt meddelande — använd i stället koder
  • Behåll undantagsklassernas namn i PascalCase och låt dem sluta på Exception
  • Dokumentera vilka undantag varje metod kan kasta

Snabbtest

Vilken PHP-basklass ska utökas för att skapa ett anpassat undantag som representerar ett logiskt fel i koden?

Sammanfattning: anpassade undantag

Sammanfattning av anpassade undantag:

  • Utöka Exception eller en underklass
  • Lägg till domänspecifika egenskaper och metoder
  • Utforma hierarkier — fånga föräldern för att fånga alla underordnade klasser
  • Använd gränssnitt för att gruppera obesläktade undantag
  • Använd statiska namngivna konstruktorer för tydlighet
  • Anropa alltid parent::__construct()
Gratis att börja

Lär dig PHP med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
49
Lektioner
195

Vanliga frågor

Är lektionen ”Skapa egna undantag” gratis?

Ja – hela texten till ”Skapa egna undantag” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i PHP Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i PHP Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Skapa egna undantag”?

Utöka klassen Exception för att skapa domänspecifika feltyper. Ni övar på PHP Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig PHP Academy?

Du behöver inga förkunskaper. Utbildningen i PHP Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Skapa egna undantag”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här PHP Academy-lektionen?

Ja. Varje PHP Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. PHP-feltyper och felrapportering
  2. Try, Catch och Finally
  3. Skapa egna undantag
  4. Logga fel och bästa praxis
← Tillbaka till PHP Academy