PHP Proovi püüdmise näide: erandite ja vigade käsitlemise õpetus

Mis on erand?

Viga on programmi ootamatu tulemus, millega programm ise hakkama ei saa.

Vead lahendatakse programmi parandamisega. Vea näide on lõpmatu tsükkel, mis ei lõpe kunagi täitmist.

Erandiks on ootamatu programmitulemus, millega saab programm ise hakkama.

Erandi näideteks on katse avada faili, mida pole olemas.

Seda erandit saab käsitleda faili loomisega või kasutajale faili otsimise võimaluse esitamisega.

Miks teha erandit?

  • Vältige meie lehtedel ootamatuid tulemusi, mis võivad lõppkasutajaid väga tüütu või ärritada
  • Parandage meie rakenduste turvalisust, mitte avaldades teavet, mida pahatahtlikud kasutajad võivad meie rakenduste ründamiseks kasutada
  • Php erandeid kasutatakse programmi normaalse voolu muutmiseks, kui ilmneb mõni prognoositav viga.

PHP vigade käsitlemine

Kui ilmneb tõrge, olenevalt teie konfiguratsiooniseadetest, PHP kuvab veebibrauseris veateate koos ilmnenud vea kohta käiva teabega.

PHP pakub mitmeid viise vigade käsitlemiseks.

Vaatleme kolme (3) tavaliselt kasutatavat meetodit;

  1. Surma avaldused- die funktsioon ühendab kaja ja väljumise funktsiooni ühes. See on väga kasulik, kui tahame tõrke korral sõnumi väljastada ja skripti täitmise peatada.
  2. Kohandatud veakäsitlejad – need on kasutaja määratletud funktsioonid, mis kutsutakse välja iga kord, kui ilmneb tõrge.
  3. PHP veateade – tõrketeade, mis sõltub teie PHP veateate seadetest. See meetod on väga kasulik arenduskeskkonnas, kui teil pole õrna aimugi, mis vea põhjustas. Kuvatav teave võib aidata teil rakendust siluda.

Näidete käsitlemise vead

Vaatame nüüd mõnda lihtsat näidet vigade käsitlemise rutiinide kohta.

Oletame, et oleme välja töötanud rakenduse, mis kasutab andmete salvestamiseks tekstifaile. Võib-olla tahame kontrollida faili olemasolu, enne kui proovime sellest andmeid lugeda.

Allolev kood rakendab ülaltoodud näidet.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Eeldades, et salvestasite faili simple_error.php kausta phptuts, avage URL http://localhost/phptuts/simple_error.php

Saate järgmised tulemused

PHP vigade käsitlemine

Nagu ülaltoodud tulemustest näha, muudab see meie rakenduse ebaprofessionaalseks ja võib kasutajat häirida.

Muudame ülaltoodud koodi ja kirjutame rakendusele veakäsitleja

<?php
$denominator = 0;
if ($denominator != 0) {
    echo 2 / $denominator;
} else {
    echo "cannot divide by zero (0)";
}
?>

Eeldades, et salvestasite ülaltoodud koodi kui error_handling.php, avage URL http://localhost/phptuts/error_handling.php

PHP erandikäepide PHP-s

Märge: Hea turvatava on kuvada teade ülaltoodud kujul, selle asemel, et kuvada teade "Faili ei leitud".

Vaatame teist näidet, mis kasutab kohandatud veakäsitlejat.

Kohandatud veakäsitleja seatakse PHP vaikimisi veakäsitluse funktsiooniks ja see kuvab põhimõtteliselt veanumbri ja teate.

Allolev kood illustreerib ülaltoodud näite rakendamist

<?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);
?>

Avage URL http://localhost/phptuts/custom_error_handler.php saate järgmised tulemused

. PHP vigade käsitlemine


Nagu ülaltoodud näitest näete, on kohandatud veakäsitlejad selles mõttes võimsad

  • Need võimaldavad meil veateateid kohandada.
  • Kohandatud veakäsitleja võib hõlmata ka vigade logimist faili/andmebaasi, meili saatmist arendajale jne.

Vaatame nüüd kolmandat tüüpi veakäsitlust. Kasutame PHP sisseehitatud funktsiooni error_reporting. Sellel on järgmine põhisüntaks

<?php
error_reporting($reporting_level);
?>

SIIN,

  • "Error_reporting" on PHP veateate funktsioon
  • „$reporting_level” on valikuline, seda saab kasutada aruandlustaseme määramiseks. Kui aruandluse taset pole määratud, kasutab PHP php.ini failis määratud veateate vaiketaset.
Aruandluse tase Kirjeldus Näide
E_HOIATUS Kuvab ainult hoiatussõnumeid. Ei peata skripti täitmist veateade(E_HOIATUS);
E_MÄRKUS Kuvab teateid, mis võivad ilmneda programmi tavapärase täitmise ajal või olla tõrge. error_reporting(E_ MÄRKUS);
E_USER_ERROR Kuvab kasutaja loodud vead, st kohandatud veakäsitleja vea_teavitamine(E_ USER_ERROR);
E_USER_WARNING Kuvab kasutaja loodud hoiatusteateid error_reporting(E_USER_WARNING);
E_USER_NOTICE Kuvab kasutaja loodud teateid error_reporting(E_USER_NOTICE);
E_RECOVERABLE_ERROR Kuvab vead, mis ei ole surmavad ja mida saab käsitleda kohandatud veakäsitlejate abil vea_teavitamine(E_RECOVERABLE_ERROR);
E_ALL Kuvab kõik vead ja hoiatused vea_teavitamine(E_ KÕIK);

Vigade ja erandite erinevus

  • Erandeid tehakse ja need on mõeldud tabamiseks, samas kui vead on üldiselt parandamatud.
  • Erandeid käsitletakse objektorienteeritud viisil. See tähendab, kui tehakse erand; luuakse erandiobjekt, mis sisaldab erandi üksikasju.

Allolev tabel näitab erandiobjekti meetodeid

Meetod Kirjeldus Näide
getMessage() Kuvab erandi sõnumi
<?php
echo $e->getMessage();
?>
getCode() Kuvab numbrikoodi, mis tähistab erandit
<?php
echo $e->getCode();
?>
getFile() Kuvab failinime ja tee, kus erand tekkis
<?php
echo $e->getFile();
?>
getLine() Kuvab rea numbri, kus erand toimus
<?php
echo $e->getLine();
?>
getTrace() Kuvab enne erandit tagasijälje massiivi
<?php
print_r( $e->getTrace());
?>
getPrevious() Kuvab eelmise erandi enne praegust
<?php
echo $e->getPrevious();
?>
getTraceAsString() Kuvab erandi tagajälje massiivi asemel stringina
<?php
echo $e->getTraceAsString();
?>
__toString() Kuvab kogu erandi stringina
<?php
echo $e->__toString();
?>


Allpool on toodud erandi tegemise põhisüntaks.

<?php
throw new Exception("This is an exception example");
?>

SIIN,

  • "viska" on märksõna, mida kasutatakse erandi viskamiseks
  • "new Exception(…)" loob erandiobjekti ja edastab sõnumi parameetriks stringi "See on erandi näide".

Ülaltoodud kood väljastab järgmise teate.

PHP erandikäepide PHP-s

Vaatame nüüd näidet, mis rakendab viskamise ja püüdmise erandeid.

Muudame ülaltoodud näidet ja lisame proovimise, viskamise ja püüdmise.

Sellel on järgmine põhisüntaks.

<?php
try {
    //code goes here that could potentially throw an exception
}
catch (Exception $e) {
    //exception handling code goes here
}
?>

SIIN,

  • „Try{…}” on käivitatav koodiplokk, mis võib põhjustada erandi
  • "catch(Exception $e){…}" on koodiplokk, mis püüab kinni visatud erandi ja määrab erandiobjekti muutujale $e.

Allolev kood näitab peamise erandi näidet koos rakendatud proovi, viska ja püüdmise erandiga.

Programm loob tahtlikult erandi, mille ta seejärel kinni püüab.

<?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();
}
?>

Avage URL http://localhost/phptuts/exception_handling.php Saate järgmised tulemused.

PHP erandikäepide PHP-s

Samuti on võimalik luua mitu erandit ühele php try-lausele olenevalt visatud erandi tüübist.

Vaadake artiklit teemal MySQL, juurdepääs PHP andmetele… mitme erandi rakendamise näidete jaoks

Mitu erandit

Mitu erandit kasutage visatud erandite käsitlemiseks mitut proovi püüdmise plokki. Mitu erandit on kasulikud, kui;

  • Soovite kuvada kohandatud sõnumit sõltuvalt visatud erandist
  • Sõltuvalt visatud erandist soovite teha ainulaadse toimingu

Allolev vooskeem illustreerib mitme erandi toimimist

Mitu erandit

Vaatame näidet, mis kasutab mitut erandit.

Muudame koodi, mis jagab arvu edastatud nimetajaga.

Eeldame kahte tüüpi erandeid;

  • Nulliga jagamine
  • Jagamine negatiivse arvuga

Lihtsuse huvides kuvame oma püüdeplokkides ainult erandi tüüpi.

Erandite klassis ehitatud PHP-d kasutatakse erandite loomiseks.

Loome kaks klassi, mis laiendavad erandite klassi ja kasutavad neid erandite loomiseks.

Allolev kood näitab rakendamist.

<?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);
?>

Koodi testimine

Eeldame, et salvestasite faili multiple_exceptions.php kausta phptuts.

Sirvige URL-i http://localhost/phptuts/multiple_exceptions.php

PHP erandikäepide PHP-s

Lülitage tagasi PHP-failile ja sisestage parameetriks -1, nagu on näidatud järgmisel diagrammil.

PHP erandikäepide PHP-s

Sirvige URL-i http://localhost/phptuts/multiple_exceptions.php.

Milliseid tulemusi saate? Parameetrina sisestage 3.

Milliseid tulemusi saate?

kokkuvõte

  • Vead on PHP koodi tekitatud ootamatud tulemused
  • Vigade käsitlemine parandab rakenduse jõudlust
  • PHP-l on sisseehitatud funktsioonid, mida saab kasutada PHP vigadest teatamise viiside kohandamiseks
  • Erandid on nagu vead, kuid neid saab visates tabada püüdmisploki abil.
  • Veateavet kuvavate veateadete kuvamist peetakse halvaks turvatavaks.