Try, catch i finally
Sprawnie obsługuj wyjątki czasu wykonywania za pomocą bloków try/catch/finally
Try, catch i finally to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.
Wyjątki a błędy
PHP oferuje dwa sposoby sygnalizowania problemów:
- Errors — tradycyjne komunikaty Notice, Warning i Fatal w PHP (omówione w poprzedniej lekcji)
- Exceptions — obiekty zgłaszane, gdy wystąpi coś wyjątkowego; przechwytuje się je za pomocą try/catch
Wyjątki to nowoczesne i zalecane rozwiązanie do obsługi błędów, z których można odzyskać działanie programu.
Zgłaszanie wyjątku
Użyj throw, aby zasygnalizować wystąpienie problemu:
<?php
function divide(float $a, float $b): float {
if ($b == 0) {
throw new InvalidArgumentException('Cannot divide by zero');
}
return $a / $b;
}
echo divide(10, 2); // 5
// divide(10, 0); // throws exceptionBlok try / catch
Umieść kod, który może zgłosić wyjątek, w bloku try, a następnie obsłuż wyjątki w bloku catch:
<?php
try {
$result = divide(10, 0);
echo $result;
} catch (InvalidArgumentException $e) {
echo 'Error: ' . $e->getMessage();
echo ' in ' . $e->getFile() . ':' . $e->getLine();
}Wiele bloków catch
Różne typy wyjątków przechwytuj w osobnych blokach catch:
<?php
try {
$pdo = new PDO($dsn, $user, $pass);
$result = performQuery($pdo);
} catch (PDOException $e) {
error_log('DB error: ' . $e->getMessage());
echo 'Database unavailable';
} catch (RuntimeException $e) {
echo 'Runtime error: ' . $e->getMessage();
} catch (\Throwable $e) {
echo 'Unexpected error: ' . $e->getMessage();
}Blok finally
Blok finally wykonuje się niezależnie od tego, czy zgłoszono wyjątek — doskonale nadaje się do sprzątania:
<?php
$connection = null;
try {
$connection = openDatabaseConnection();
$data = fetchData($connection);
} catch (DatabaseException $e) {
error_log($e->getMessage());
echo 'DB error';
} finally {
// Always runs — even if exception was thrown
if ($connection) {
closeConnection($connection);
}
}Hierarchia wyjątków
Hierarchia klas wyjątków w PHP:
Throwable(interfejs)- ├─
Error— błędy silnika PHP (TypeError, ParseError…) - └─
Exception— wyjątki aplikacji - ├─
RuntimeException - ├─
InvalidArgumentException - ├─
LogicException - └─
PDOException
Przechwytywanie Throwable
Za pomocą Throwable można przechwytywać zarówno Exceptions, jak i Errors w PHP:
<?php
try {
$result = someFunction();
} catch (\Exception $e) {
echo 'Exception: ' . $e->getMessage();
} catch (\Error $e) {
echo 'PHP Error: ' . $e->getMessage();
}
// Or catch both at once:
try {
// ...
} catch (\Throwable $e) {
echo get_class($e) . ': ' . $e->getMessage();
}Wspólny catch (PHP 8)
PHP 8 umożliwia przechwytywanie wielu typów wyjątków w jednym bloku catch:
<?php
try {
processRequest();
} catch (InvalidArgumentException | RuntimeException $e) {
echo 'Handled: ' . $e->getMessage();
}
// Compare PHP 7 approach:
// catch (InvalidArgumentException $e) { ... }
// catch (RuntimeException $e) { ... }Ponowne zgłaszanie wyjątków
Przechwyć wyjątek, zarejestruj go i zgłoś ponownie, aby przekazać go wyżej na stosie wywołań:
<?php
function processOrder(int $id): void {
try {
$order = loadOrder($id);
$order->process();
} catch (PaymentException $e) {
error_log('Payment failed for order ' . $id . ': ' . $e->getMessage());
throw $e; // re-throw after logging
}
}Łączenie wyjątków
Przekaż pierwotny wyjątek jako wyjątek „previous”, aby zachować kontekst:
<?php
try {
$data = fetchFromAPI();
} catch (NetworkException $e) {
throw new ServiceUnavailableException(
'Cannot reach upstream service',
0,
$e // $previous — preserves original cause
);
}
// Retrieve original:
// $e->getPrevious()set_exception_handler
Zarejestruj globalny moduł obsługi nieprzechwyconych wyjątków:
<?php
set_exception_handler(function(\Throwable $e): void {
error_log(sprintf(
'[UNCAUGHT] %s: %s in %s:%d',
get_class($e),
$e->getMessage(),
$e->getFile(),
$e->getLine()
));
http_response_code(500);
echo 'An unexpected error occurred. Please try again.';
exit(1);
});Szybki test
Który blok w konstrukcji try/catch/finally ma gwarancję wykonania niezależnie od tego, czy zostanie zgłoszony wyjątek?
Podsumowanie: try/catch/finally
Podsumowanie obsługi wyjątków:
- Zgłaszaj wyjątki za pomocą
throw new ExceptionClass() - Przechwytuj je za pomocą
catch (Type $e) - Stosuj wiele bloków catch dla różnych typów
finallyzawsze się wykonuje — używaj go do sprzątania- W PHP 8 używaj wspólnego catch:
catch (A | B $e) - Zgłaszaj wyjątek ponownie, aby zachować kontekst stosu wywołań
Często zadawane pytania
Czy lekcja „Try, catch i finally” jest bezpłatna?
Tak — pełny tekst „Try, catch i finally” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Try, catch i finally”?
Sprawnie obsługuj wyjątki czasu wykonywania za pomocą bloków try/catch/finally Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć PHP Academy?
Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Try, catch i finally”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?
Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Typy błędów PHP i raportowanie
- Try, catch i finally
- Tworzenie własnych wyjątków
- Rejestrowanie błędów i dobre praktyki