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ää;

  1. 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.
  2. Mukautetut virhekäsittelijät – nämä ovat käyttäjän määrittämiä toimintoja, joita kutsutaan aina virheen sattuessa.
  3. 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

PHP-virheiden käsittely

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

PHP poikkeuskahva PHP:ssä

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

. PHP-virheiden käsittely


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.

PHP poikkeuskahva PHP:ssä

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.

PHP poikkeuskahva PHP:ssä

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

Useita poikkeuksia

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

PHP poikkeuskahva PHP:ssä

Vaihda takaisin PHP-tiedostoon ja anna -1 parametriksi seuraavan kaavion mukaisesti.

PHP poikkeuskahva PHP:ssä

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ä.