0Pricing
PHP Academy · Lekcja

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 exception

Blok 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
  • finally zawsze 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

  1. Typy błędów PHP i raportowanie
  2. Try, catch i finally
  3. Tworzenie własnych wyjątków
  4. Rejestrowanie błędów i dobre praktyki
← Powrót do PHP Academy