PHP Kokeile Catch -esimerkki: Poikkeus- ja virheenkäsittelyn opetusohjelma
Mikä on poikkeus?
Virhe on odottamaton ohjelman tulos, jota ohjelma ei itse pysty käsittelemään.
Virheet korjataan korjaamalla ohjelma. Esimerkki virheestä olisi ääretön silmukka, joka ei koskaan pysähdy suorittamasta.
Poikkeuksena on odottamaton ohjelmatulos, jonka ohjelma voi itse käsitellä.
Esimerkkejä poikkeuksista ovat yrittämättä avata tiedosto, jota ei ole olemassa.
Tämä poikkeus voidaan käsitellä joko luomalla tiedosto tai antamalla käyttäjälle mahdollisuus etsiä tiedostoa.
Miksi käsitellä poikkeusta?
- Vältä odottamattomia tuloksia sivuillamme, jotka voivat olla erittäin ärsyttäviä tai ärsyttäviä loppukäyttäjillemme
- Paranna sovelluksiemme turvallisuutta jättämällä paljastamatta tietoja, joita pahantahtoiset käyttäjät voivat käyttää hyökkääessään sovelluksiimme
- Php-poikkeuksia käytetään muuttamaan ohjelman normaalia kulkua, jos tapahtuu ennakoitavissa oleva virhe.
PHP-virheiden käsittely
Kun virhe tapahtuu, kokoonpanoasetuksistasi riippuen, PHP näyttää verkkoselaimessa virheilmoituksen tapahtuneeseen virheeseen liittyvillä tiedoilla.
PHP tarjoaa useita tapoja käsitellä virheitä.
Aiomme tarkastella kolmea (3) yleisesti käytettyä menetelmää;
- Kuole lausunnot– die-toiminto yhdistää kaiku- ja poistumistoiminnot yhdeksi. Se on erittäin hyödyllinen, kun haluamme lähettää viestin ja pysäyttää komentosarjan suorittamisen virheen sattuessa.
- Mukautetut virhekäsittelijät – nämä ovat käyttäjän määrittämiä toimintoja, joita kutsutaan aina virheen sattuessa.
- PHP virhe raportointi – virheilmoitus PHP-virheraportointiasetuksistasi riippuen. Tämä menetelmä on erittäin hyödyllinen kehitysympäristössä, kun sinulla ei ole aavistustakaan, mikä aiheutti virheen. Näytetyt tiedot voivat auttaa sinua sovelluksesi virheenkorjauksessa.
Virhe esimerkkejä käsiteltäessä
Katsotaanpa nyt joitain yksinkertaisia esimerkkejä virheenkäsittelyrutiineista.
Oletetaan, että olemme kehittäneet sovelluksen, joka käyttää tekstitiedostoja tietojen tallentamiseen. Haluamme ehkä tarkistaa tiedoston olemassaolon ennen kuin yritämme lukea tietoja siitä.
Alla oleva koodi toteuttaa yllä olevan esimerkin.
<?php $denominator = 0; echo 2 / $denominator; ?>
Jos olet tallentanut tiedoston simple_error.php phptuts-kansioon, avaa URL-osoite http://localhost/phptuts/simple_error.php
Saat seuraavat tulokset
Kuten yllä olevista tuloksista näet, se saa sovelluksemme näyttämään epäammattimaiselta ja voi olla ärsyttävää käyttäjälle.
Muokkaamme yllä olevaa koodia ja kirjoitamme sovellukselle virhekäsittelijän
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Jos olet tallentanut yllä olevan koodin nimellä error_handling.php, avaa URL-osoite http://localhost/phptuts/error_handling.php
Huomautus: on hyvä suojauskäytäntö näyttää viesti yllä olevan kaltaisena sen sijaan, että näyttäisit viestin kuten "Tiedostoa ei löydy".
Katsotaanpa toista esimerkkiä, joka käyttää mukautettua virheenkäsittelijää.
Mukautettu virheenkäsittelijä asetetaan oletusarvoiseksi PHP-virheenkäsittelytoiminnoksi, ja se näyttää periaatteessa virhenumeron ja -viestin.
Alla oleva koodi havainnollistaa yllä olevan esimerkin toteutusta
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Avaa URL-osoite http://localhost/phptuts/custom_error_handler.php saat seuraavat tulokset
Kuten yllä olevasta esimerkistä näet, mukautetut virhekäsittelijät ovat tehokkaita siinä mielessä
- Niiden avulla voimme mukauttaa virheilmoituksia.
- Mukautettu virhekäsittelijä voi sisältää myös virheen kirjaamisen tiedostoon/tietokantaan, sähköpostin lähettämisen kehittäjälle jne.
Tarkastellaan nyt kolmatta virheenkäsittelyn tyyppiä. Käytämme PHP:n sisäänrakennettua error_reporting-funktiota. Siinä on seuraava perussyntaksi
<?php error_reporting($reporting_level); ?>
TÄSSÄ,
- "error_reporting" on PHP:n virheraportointitoiminto
- "$raportointitaso" on valinnainen, sitä voidaan käyttää raportointitason asettamiseen. Jos raportointitasoa ei ole määritetty, PHP käyttää oletusarvoista virheraportointitasoa, joka on määritetty php.ini-tiedostossa.
Raportointitaso | Tuotetiedot | esimerkki |
---|---|---|
E_VAROITUS | Näyttää vain varoitusviestit. Ei pysäytä käsikirjoituksen suorittamista | virhe_raportointi(E_VAROITUS); |
HUOMAUTUS | Näyttää ilmoitukset, joita voi esiintyä ohjelman normaalin suorituksen aikana tai jotka voivat olla virhe. | virhe_raportointi(E_ ILMOITUS); |
E_USER_ERROR | Näyttää käyttäjien luomat virheet eli mukautetun virhekäsittelijän | virhe_raportointi(E_ USER_ERROR); |
E_USER_WARNING | Näyttää käyttäjien luomat varoitusviestit | error_reporting(E_USER_WARNING); |
E_USER_NOTICE | Näyttää käyttäjien luomat ilmoitukset | error_reporting(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Näyttää virheet, jotka eivät ole kohtalokkaita ja jotka voidaan käsitellä mukautetuilla virhekäsittelijöillä | virheen_raportointi(E_RECOVERABLE_ERROR); |
E_ALL | Näyttää kaikki virheet ja varoitukset | virhe_raportointi(E_ KAIKKI); |
Ero virheiden ja poikkeuksien välillä
- Poikkeuksia tehdään ja ne on tarkoitus saada kiinni, kun taas virheet ovat yleensä korjaamattomia.
- Poikkeukset käsitellään oliosuuntautuneesti. Tämä tarkoittaa, kun poikkeus heitetään; luodaan poikkeusobjekti, joka sisältää poikkeuksen tiedot.
Alla oleva taulukko näyttää poikkeusobjektien menetelmät
Menetelmä | Tuotetiedot | esimerkki |
---|---|---|
getMessage() | Näyttää poikkeuksen viestin |
<?php echo $e->getMessage(); ?> |
Hanki koodi() | Näyttää poikkeusta edustavan numerokoodin |
<?php echo $e->getCode(); ?> |
getFile() | Näyttää tiedostonimen ja polun, jossa poikkeus tapahtui |
<?php echo $e->getFile(); ?> |
getLine() | Näyttää rivinumeron, jolla poikkeus tapahtui |
<?php echo $e->getLine(); ?> |
getTrace() | Näyttää joukon paluujäljitystä ennen poikkeusta |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Näyttää edellisen poikkeuksen ennen nykyistä |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Näyttää poikkeuksen backtrace-merkin merkkijonona taulukon sijaan |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Näyttää koko poikkeuksen merkkijonona |
<?php echo $e->__toString(); ?> |
Alla on perussyntaksi poikkeuksen heittämiseen.
<?php throw new Exception("This is an exception example"); ?>
TÄSSÄ,
- "heittää" on avainsana, jota käytetään heittämään poikkeus
- "new Exception(…)" luo poikkeusobjektin ja välittää "Tämä on poikkeusesimerkki" -merkkijonon viestiparametriksi.
Yllä oleva koodi tulostaa seuraavan viestin.
Aiomme nyt tarkastella esimerkkiä, joka toteuttaa heitto- ja kiinnipoikkeuksia.
Muokkaamme yllä olevaa esimerkkiä ja sisällytämme siihen kokeilun, heiton ja kiinni.
Siinä on seuraava perussyntaksi.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
TÄSSÄ,
- "try{…}" on suoritettava koodilohko, joka saattaa aiheuttaa poikkeuksen
- "catch(Exception $e){…}" on koodilohko, joka saa kiinni heitetyn poikkeuksen ja määrittää poikkeusobjektin muuttujalle $e.
Alla oleva koodi näyttää peruspoikkeusesimerkin kokeile-, heit- ja pyydyspoikkeuksella.
Ohjelma heittää tarkoituksella poikkeuksen, jonka se sitten saa kiinni.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Avaa URL-osoite http://localhost/phptuts/exception_handling.php Saat seuraavat tulokset.
On myös mahdollista luoda useita poikkeuksia yhdelle php try -lausekkeelle riippuen poikkeuksen tyypistä.
Katso artikkeli aiheesta MySQL, PHP-tietojen käyttö… useiden poikkeusten toteutusesimerkkejä varten
Useita poikkeuksia
Useita poikkeuksia käyttämällä useita try catch -lohkoja heitettyjen poikkeuksien käsittelemiseen. Useat poikkeukset ovat hyödyllisiä, kun;
- Haluat näyttää mukautetun viestin heitetyn poikkeuksen mukaan
- Haluat suorittaa ainutlaatuisen toiminnon heitetyn poikkeuksen mukaan
Alla oleva vuokaavio havainnollistaa, kuinka useat poikkeukset toimivat
Katsotaanpa esimerkkiä, jossa käytetään useita poikkeuksia.
Muokkaamme koodia, joka jakaa luvun välitetyllä nimittäjällä.
Odotamme kahdenlaisia poikkeuksia tapahtuvan;
- Nollalla jakaminen
- Jako negatiivisella luvulla
Yksinkertaisuuden vuoksi näytämme vain poikkeustyypin catch-lohkoissamme.
Poikkeusluokassa rakennettua PHP:tä käytetään heittämään poikkeuksia.
Luomme kaksi luokkaa, jotka laajentavat poikkeusluokkaa ja käyttävät niitä poikkeuksien tekemiseen.
Alla oleva koodi näyttää toteutuksen.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Koodin testaus
Oletamme, että olet tallentanut tiedoston multiple_exceptions.php phptuts-kansioon.
Selaa URL-osoitteeseen http://localhost/phptuts/multiple_exceptions.php
Vaihda takaisin PHP-tiedostoon ja anna -1 parametriksi seuraavan kaavion mukaisesti.
Selaa URL-osoitteeseen http://localhost/phptuts/multiple_exceptions.php.
Mitä tuloksia saat? Anna 3 parametriksi.
Mitä tuloksia saat?
Yhteenveto
- Virheet ovat PHP-koodin tuottamia odottamattomia tuloksia
- Virheiden käsittely parantaa sovelluksen suorituskykyä
- PHP:ssä on sisäänrakennettuja toimintoja, joiden avulla voidaan mukauttaa tapaa, jolla PHP raportoi virheistä
- Poikkeukset ovat kuin virheitä, mutta ne voidaan saada kiinni käyttämällä kiinnityslohkoa heitettäessä.
- Virhetietoja sisältävien virheilmoitusten näyttämistä pidetään huonona tietoturvakäytännönä.