PHP poikkeuskäsittely
- Edellinen sivu PHP Virhe
- Seuraava sivu PHP Suodattimet
Poikkeus (Exception) käytetään muuttamaan skriptin normaalista suoritusketjusta määritetyissä virhe- (poikkeus-)tilanteissa.
Mikä on poikkeus?
PHP 5 tarjoaa uuden objektiointipohjaisen virheenkäsittelymenetelmän.
Poikkeuskäsittely käytetään muuttamaan skriptin normaalista suoritusketjusta määritetyissä virhe- (poikkeus-)tilanteissa. Tämä tilanne kutsutaan poikkeukseksi.
Kun poikkeus tapahtuu, tapahtuu yleensä:
- Nykyinen koodin tila tallennetaan
- Koodin suoritus siirtyy määritettyyn poikkeuskäsittelijäfunktiota
- Käytännön mukaan käsittelijä voi aloittaa uudelleen suorittamaan koodia tallennetusta koodin tilasta, lopettaa skriptin suorittamisen tai jatkaa suorittamista koodin toisesta paikasta
Näytämme erilaisia virheenkäsittelymenetelmiä:
- Poikkeuksen peruskäyttö
- Luodaan mukautettu poikkeuskäsittelijä
- Useat poikkeukset
- Heitä poikkeus uudelleen
- Ylätason poikkeuskäsittelijän asettaminen
Poikkeuksen peruskäyttö
Kun poikkeus heitetään, sen jälkeinen koodi ei jatku suorittamista, PHP yrittää löytää vastaavan "catch"-koodin.
Jos poikkeusta ei oteta vastaan ja ei käytetä set_exception_handler() -funktiota vastaavaan käsittelyyn, tapahtuu vakava virhe (fatalityys) ja tulostetaan virheilmoitus "Uncaught Exception" (ei otettu vastaan poikkeus).
Kokeillaan heittää poikkeus, emmekä kuitenkaan oteta sitä vastaan:
<?php //luo funktio poikkeuksella function checkNum($number) { if($number>1) { throw new Exception("Arvon on oltava 1 tai alle"); } return true; } //aiheuta poikkeus checkNum(2); ?>
Yllä oleva koodi tuottaa samankaltaisen virheen:
Fatalityys virhe: Käsittämätön poikkeus 'Exception' viestillä 'Arvon täytyy olla 1 tai alle' C:\webfolder\test.php:6 Pyrkysjälki: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} heitetty C:\webfolder\test.php rivillä 6
Try, throw ja catch
Välttääksesi edellä olevassa esimerkissä olevan virheen, meidän on luotava sopivia koodin osia poikkeusten käsittelyä varten.
Oikeanlaisen käsittelyn tulisi sisältää:
- Yritä - Poikkeusfunktioiden käyttö tulisi olla "try"-koodin sisällä. Jos poikkeusta ei tapahdu, koodi jatkuu tavalliseen tapaan. Jos poikkeus kuitenkin tapahtuu, se heittää poikkeuksen.
- Throw - Tässä määritellään, miten poikkeus heitetään. Jokaiselle "throw"-ilmentymälle on oltava vähintään yksi "catch"-ilmentymä
- Catch - "catch"-koodikohdassa poikkeus kapsellutetaan, ja luodaan objekti, joka sisältää poikkeustiedot
Aloitetaan poikkeuksen heittämällä:
<?php //Luo funktio, joka voi heittää poikkeuksen function checkNum($number) { if($number>1) { throw new Exception("Arvon on oltava 1 tai alle"); } return true; } //Käännä poikkeus "try"-koodikohdassa try { checkNum(2); //Jos poikkeus heitetään, tämä teksti ei näy echo 'Jos näet tämän, luku on 1 tai alle'; } //K捕捉异常 catch(Exception $e) { echo 'Viesti: ' .$e->getMessage(); } ?>
Yllä oleva koodi tuottaa tällaisen virheen:
Viesti: Arvon on oltava 1 tai alle
Esimerkki selitetään:
Yllä oleva koodi heittää poikkeuksen ja käsittää sen:
- Luo checkNum()-funktio. Se tarkistaa, onko numero suurempi kuin 1. Jos on, se heittää poikkeuksen.
- Kutsutaan checkNum()-funktiota "try"-koodikohdassa.
- checkNum()-funktiossa tapahtuva poikkeus heitetään ulos
- "catch"-koodi vastaanottaa tämän poikkeuksen ja luo objektin, joka sisältää poikkeustiedot ($e).
- Kutsuttuna $e->getMessage() tätä exception-objektia, tulostetaan virheilmoitus, joka tulee tästä poikkeuksesta.
Kuitenkin, noudattaaksemme "jokaiselle throwille on oltava catch"-periaatetta, voidaan asettaa ylätason poikkeuskäsittelijä käsittämään puuttuvat virheet.
Luo mukautettu Exception-luokka
Mukautetun poikkeuskäsittelijän luominen on erittäin yksinkertaista. Luomme yksityisen luokan, jota voidaan kutsua PHP:n poikkeusten tapahtuessa. Tämä luokka on oltava exception-luokan laajennus.
Tämä mukautettu exception-luokka perii kaikki PHP:n exception-luokan ominaisuudet, ja voit lisätä siihen omia funktioita.
Aloitetaan luomaan exception-luokka:
<?php class customException extends Exception { public function errorMessage() { //virheilmoitus $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() : <b>'.$this->getMessage().'</b> ei ole kelvollinen sähköpostiosoite return $errorMsg; } } $email = "joku@example...com"; try { //Tarkista if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //heitä poikkeus, jos sähköpostiosoite ei ole kelvollinen throw new customException($email); } } catch (customException $e) { //näytä mukautettu viesti echo $e->errorMessage(); } ?>
Tämä uusi luokka on vanhan exception-luokan kopio, ja siihen on lisätty errorMessage()-funktio. Koska se on vanhan luokan kopio, se perii vanhasta luokasta ominaisuudet ja metodit, joten voimme käyttää exception-luokan menetelmiä, kuten getLine(), getFile() ja getMessage()}
Esimerkki selitetään:
Yllä oleva koodi heittää poikkeuksen ja ottaa sen kiinni mukautetulla exception-luokalla:
- customException()-luokka luodaan vanhan exception-luokan laajennuksena. Tämä tarkoittaa, että se peri vanhan luokan kaikki ominaisuudet ja metodit.
- Luo errorMessage()-funktio. Jos sähköpostiosoite ei ole kelvollinen, funktio palauttaa virheilmoituksen
- Aseta $email-muuttuja kelvottomaksi sähköpostiosoite-merkkijonoksi
- Suorita "try"-koodikappale, koska sähköpostiosoite ei ole kelvollinen, heitetään poikkeus
- "catch"-koodikappale ottaa poikkeuksen kiinni ja näyttää virheilmoituksen
Useat poikkeukset
Voit käyttää useita poikkeuksia yhdelle skriptille tarkastaaksesi useita tilanteita.
Voit käyttää useita if..else-koodikappaleita, yhtä switch-koodikappaletta tai sisäkkäisiä poikkeuksia. Nämä poikkeukset voivat käyttää eri exception-luokkia ja palauttaa eri virheilmoituksia:
<?php class customException extends Exception { public function errorMessage() { //virheilmoitus $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile() : <b>'.$this->getMessage().'</b> ei ole kelvollinen sähköpostiosoite return $errorMsg; } } $email = "someone@example.com"; try { //Tarkista if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { //heitä poikkeus, jos sähköpostiosoite ei ole kelvollinen throw new customException($email); } //tarkista, sisältääkö sähköpostiosoite merkkijonon "example" if(strpos($email, "example") !== FALSE) { throw new Exception("$email is an example e-mail"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Esimerkki selitetään:
Yllä oleva koodi testaa kahta ehtoa, ja jos mikään ehto ei ole tosi, heitetään poikkeus:
- customException()-luokka luodaan vanhan exception-luokan laajennuksena. Tämä tarkoittaa, että se peri vanhan luokan kaikki ominaisuudet ja metodit.
- Luodaan errorMessage()-funktio. Jos sähköpostiosoite ei ole kelvollinen, funktio palauttaa virheilmoituksen.
- Suorita "try"-koodikappale, ensimmäisessä ehdossa ei heitetä poikkeusta.
- Koska sähköposti sisältää merkkijonon "example", toinen ehto laukaisee poikkeuksen.
- "catch"-koodikappale ottaa poikkeuksen kiinni ja näyttää sopivan virheilmoituksen
Jos customException ei ole otettu kiinni ja vain base exception on otettu kiinni, käsittele poikkeusta siellä.
Heitä poikkeus uudelleen
Jos poikkeus heitetään, voit halutessasi käsitellä sitä eri tavalla kuin tavallisesti. Voit heittää poikkeuksen uudelleen "catch"-koodikappaleessa.
Skripti tulisi piilottaa järjestelmävirheet käyttäjältä. Vaikka järjestelmävirheet saattavat olla tärkeitä ohjelmistojen kehittäjille, käyttäjät eivät ole kiinnostuneita niistä. Helpottaakseen käyttöä, voit heittää uudelleen poikkeuksia, jotka sisältävät käyttäjäystävällisempiä viestejä:
<?php class customException extends Exception { public function errorMessage() { //virheilmoitus $errorMsg = $this->getMessage().' ei ole kelvollinen sähköpostiosoite.'; return $errorMsg; } } $email = "someone@example.com"; try { try { //tarkista, sisältääkö sähköpostiosoite merkkijonon "example" if(strpos($email, "example") !== FALSE) { //heitä poikkeus, jos sähköpostiosoite ei ole kelvollinen throw new Exception($email); } } catch(Exception $e) { //heitä poikkeus uudelleen throw new customException($email); } } catch (customException $e) { //näytä mukautettu viesti echo $e->errorMessage(); } ?>
Esimerkki selitetään:
Yllä oleva koodi tarkistaa, sisältääkö sähköpostiosoite merkkijonon "example". Jos se sisältää, poikkeus heitetään uudelleen:
- customException()-luokka luodaan vanhan exception-luokan laajennuksena. Tämä tarkoittaa, että se peri vanhan luokan kaikki ominaisuudet ja metodit.
- Luodaan errorMessage()-funktio. Jos sähköpostiosoite ei ole kelvollinen, funktio palauttaa virheilmoituksen.
- Asetetaan $email- muuttuja kelvolliseksi sähköpostiosoitteeksi, mutta se sisältää merkkijonon "example".
- "try"-koodilohko sisältää toisen "try"-koodilohkon, jotta poikkeus voidaan heittää uudelleen.
- Sähköpostiosoite sisältää merkkijonon "example", joten poikkeus käynnistyy.
- "catch" ottaa poikkeuksen ja heittää uudelleen "customException".
- Löydettiin "customException" ja näytti virheilmoituksen.
Jos poikkeus ei ole otettu kiinni nykyisessä "try"-koodikuvakkeessa, se etsii catch-kohtauksia korkeammalla tasolla.
Aseta ylätason poikkeuskäsittelijä (Top Level Exception Handler)
set_exception_handler() -funktio voi asettaa käsittelemään kaikki ei-kiinnitettyjä poikkeuksia määritellyn käyttäjän määrittämän funktion.
<?php function myException($exception) { echo "<b>Exception:</b> " , $exception->getMessage(); } set_exception_handler('myException'); throw new Exception('Uncaught Exception occurred'); ?>
Yllä olevan koodin tulisi olla seuraavanlaisen:
Exception: Uncaught Exception occurred
Yllä olevassa koodissa ei ole "catch"-kohtauksia, vaan poikkeus käynnistää ylätason poikkeuskäsittelyohjelman. Tämän funktion tulisi käyttää kaikkiä ei-kiinnitettyjä poikkeuksia.
Poikkeusten säännöt
- Poikkeuskäsittelyä vaativaa koodia tulisi sijoittaa try-koodikuvakkeeseen, jotta mahdolliset poikkeukset voidaan ottaa kiinni.
- Jokaisella try- tai throw-koodikuvakkeella on oltava vähintään yksi vastaava catch-kohtaus.
- Useiden catch-kohtauksien käyttö mahdollistaa eri tyyppisten poikkeusten ottamisen kiinni.
- Poikkeus voidaan heittää uudelleen (re-thrown) catch-kohtauksen sisällä try-koodikuvakkeessa.
Yksinkertaisesti sanottuna: jos poikkeus heitetään, sitä on otettava kiinni.
- Edellinen sivu PHP Virhe
- Seuraava sivu PHP Suodattimet