Skapa egna undantag
Utöka klassen Exception för att skapa domänspecifika feltyper.
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
RuntimeExceptionför oväntade situationer - Utöka
LogicExceptionfö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
Exceptioneller 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()
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.