Try, catch ja finally
Käsitelkää suorituksenaikaiset poikkeukset hallitusti try/catch/finally-lohkoilla.
Try, catch ja finally on ilmainen PHP Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu PHP Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. PHP Academy-kurssilla on yhteensä 4 oppituntia.
Poikkeukset ja virheet
PHP tarjoaa kaksi tapaa ilmoittaa ongelmista:
- Virheet — perinteiset PHP:n ilmoitukset, varoitukset ja vakavat virheet (käsiteltiin edellisessä oppitunnissa)
- Poikkeukset — objektit, jotka heitetään poikkeustilanteessa ja siepataan try/catch-rakenteella
Poikkeukset ovat nykyaikainen ja suositeltu tapa käsitellä virheitä, joista voidaan palautua.
Poikkeuksen heittäminen
Ilmoittakaa ongelmasta throw-lauseen avulla:
<?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 exceptiontry / catch -lohko
Ympäröikää mahdollisesti poikkeuksen heittävä koodi try-lohkolla ja käsitelkää poikkeukset catch-lohkossa:
<?php
try {
$result = divide(10, 0);
echo $result;
} catch (InvalidArgumentException $e) {
echo 'Error: ' . $e->getMessage();
echo ' in ' . $e->getFile() . ':' . $e->getLine();
}Useita catch-lohkoja
Siepatkaa eri poikkeustyypit erillisissä catch-lohkoissa:
<?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();
}finally-lohko
finally suoritetaan riippumatta siitä, heitetäänkö poikkeus — siksi se sopii erinomaisesti siivoustoimiin:
<?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);
}
}Poikkeushierarkia
PHP:n poikkeusluokkahierarkia:
Throwable(rajapinta)- ├─
Error— PHP-moottorin virheet (TypeError, ParseError…) - └─
Exception— sovelluksen poikkeukset - ├─
RuntimeException - ├─
InvalidArgumentException - ├─
LogicException - └─
PDOException
Throwablen sieppaaminen
Siepatkaa sekä poikkeukset että PHP:n virheet Throwable-tyypin avulla:
<?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();
}Usean tyypin catch (PHP 8)
PHP 8 mahdollistaa useiden poikkeustyyppien sieppaamisen yhdessä catch-lohkossa:
<?php
try {
processRequest();
} catch (InvalidArgumentException | RuntimeException $e) {
echo 'Handled: ' . $e->getMessage();
}
// Compare PHP 7 approach:
// catch (InvalidArgumentException $e) { ... }
// catch (RuntimeException $e) { ... }Poikkeusten uudelleenheittäminen
Siepatkaa, kirjatkaa lokiin ja heittäkää poikkeus uudelleen, jotta se etenee kutsupinoa ylöspäin:
<?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
}
}Poikkeusten ketjuttaminen
Välittäkää alkuperäinen poikkeus 'previous'-argumenttina, jotta asiayhteys säilyy:
<?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
Rekisteröikää yleinen käsittelemättömien poikkeusten käsittelijä:
<?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);
});Pikatarkistus
Mikä try/catch/finally-rakenteen lohko suoritetaan varmasti riippumatta siitä, heitetäänkö poikkeus?
Kertaus: try/catch/finally
Poikkeustenkäsittelyn yhteenveto:
- Heittäkää poikkeuksia komennolla
throw new ExceptionClass() - Siepatkaa poikkeukset komennolla
catch (Type $e) - Käyttäkää eri tyypeille useita catch-lohkoja
finallysuoritetaan aina — käyttäkää sitä siivoustoimiin- PHP 8:n usean tyypin catch:
catch (A | B $e) - Heittäkää poikkeus uudelleen, jotta kutsupinon asiayhteys säilyy
Opi PHP tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 49
- Oppitunnit
- 195
Usein kysytyt kysymykset
Onko oppitunti ”Try, catch ja finally” ilmainen?
Kyllä – oppitunnin ”Try, catch ja finally” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko PHP Academy-kurssin, päivitä CoddyKit PROhon. PHP Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Try, catch ja finally”?
Käsitelkää suorituksenaikaiset poikkeukset hallitusti try/catch/finally-lohkoilla. Harjoittelet PHP Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni PHP Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin PHP Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Try, catch ja finally”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä PHP Academy-oppitunnilla?
Kyllä. Jokainen PHP Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- PHP:n virhetyypit ja raportointi
- Try, catch ja finally
- Mukautettujen poikkeusten luominen
- Virheiden lokiin kirjaaminen ja parhaat käytännöt