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

⚡ Nutikas kokkuvõte

PHP veakäsitlus ja erandid hoiavad rakendused stabiilsena ja turvalisena, hallates ootamatuid tingimusi, mitte paljastades tooreid vigu. See käsiraamat selgitab vigu ja erandeid, die-lauseid, kohandatud veakäitlejaid, veateadete tasemeid ning try, throw ja catch erandite mudelit mitme eranditüübiga.

  • ⚠️ Viga vs erand: Viga on üldiselt parandamatu, samas kui erand on ootamatu tulemus, mida programm suudab tabada ja käsitleda.
  • 🛡️ Miks käepide: Vigade käsitlemine hoiab ära ebameeldiva tulemuse, kaitseb kasutajaid ja väldib andmete lekkimist, mida ründajad saaksid ära kasutada.
  • 🛑 Stantsilaused: Funktsioon die prindib teate ja peatab skripti, mis on kiire viis täitmise peatamiseks, kui midagi ebaõnnestub.
  • 🛠️ Kohandatud käitlejad: set_error_handler() suunab vead teie enda funktsiooni, et saaksite sõnumeid logida, e-postiga saata või vormindada vastavalt oma soovile.
  • 📢 Veateadete esitamine: error_reporting() ja sellised tasemed nagu E_ALL kontrollivad, milliseid hoiatusi ja teateid PHP kuvab, mis on arenduse ajal kasulik.
  • 🧲 Proovi, viska, püüa kinni: Try-plokk käivitab riskantset koodi, throw tekitab erandi ja catch käsitleb seda erandobjekti meetodite abil.
  • 🤖 Tehisintellekti abi: Tehisintellekti tööriistad saavad olemasolevale koodile lisada try-catch käsitluse ja selgitada segast koodivirna trace või veateade.

PHP veakäsitlus ja erandid

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.

Erand on ootamatu programmi tulemus, millega programm ise hakkama saab.

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 eranditega tegeleda?

  • Vältige meie lehtedel ootamatuid tulemusi, mis võivad meie lõppkasutajatele väga tüütud või ärritavad olla.
  • Parandage meie rakenduste turvalisust, mitte avaldades teavet, mida pahatahtlikud kasutajad võivad meie rakenduste ründamiseks kasutada
  • PHP erandeid kasutatakse programmi tavapärase voolu muutmiseks, kui ilmneb ennustatav tõrge.

PHP vigade käsitlemine

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

PHP pakub vigade käsitlemiseks mitmeid viise. Vaatleme kolme levinumat meetodit:

  1. Surma avaldused – funktsioon die ühendab endas funktsioonid echo ja exit. See on väga kasulik, kui soovime vea ilmnemisel väljastada teate ja peatada skripti täitmise.
  2. Kohandatud veakäsitlejad – need on kasutaja määratletud funktsioonid, mis kutsutakse välja iga kord, kui ilmneb tõrge.
  3. PHP veateade – veateade sõltub teie PHP veateate seadetest. See meetod on väga kasulik arenduskeskkonnas, kui teil pole aimugi, mis vea põhjustas. Kuvatud teave aitab teil oma rakendust siluda.

Näidete käsitlemise vead

Vaatleme nüüd mõningaid lihtsaid näiteid veakäsitlusrutiinide kohta.

Oletame, et meil on arvutus, mis suudab arvu nulliga jagada. Me tahame seda juhtumit lahendada selgelt, selle asemel, et lasta PHP-l kuvada toorviga.

Allolev kood rakendab ülaltoodud näidet.

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

Eeldades, et salvestasite faili simple_error.php phptuts kausta, avage see 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äitleja.

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

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

PHP erandikäepide PHP-s

Märge: Hea turvapraktika on kuvada ülaltoodud teadet toore teate (nt „Faili ei leitud”) asemel.

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

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 "Oops, 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.phpSaate järgmised tulemused.

PHP vigade käsitlemine

Nagu ülaltoodud näitest näha, on kohandatud veakäitlejad võimsad selles mõttes, et:

  • Need võimaldavad meil veateateid kohandada.
  • Kohandatud veakäitleja võib hõlmata ka vea logimist faili või andmebaasi, arendajale meili saatmist ja sarnaseid toiminguid.

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

<?php
error_reporting($reporting_level);
?>

SIIN,

  • "Error_reporting" on PHP veateate funktsioon
  • „$reporting_level” on valikuline ja seda saab kasutada aruandlustaseme määramiseks. Kui aruandlustaset pole määratud, kasutab PHP php.ini-failis määratud vaike-vea teatamise taset.
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. vea_teatamine(E_TEADE);
E_USER_ERROR Kuvab kasutaja loodud vead, st kohandatud veakäitleja vea_teavitus(KASUTAJA_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 vigu, mis ei ole saatuslikud ja mida saab käsitleda kohandatud veakäitlejate abil. vea_teavitamine(E_RECOVERABLE_ERROR);
E_ALL Kuvab kõik vead ja hoiatused veateadete_teatamine(KÕIK E_ID);

Vigade ja erandite erinevus

  • Erandid visatakse ja need on mõeldud püüdmiseks, samas kui vead on üldiselt parandamatud.
  • Erandeid käsitletakse objektorienteeritud viisil. See tähendab, et erandi tekkimisel luuakse erandi objekt, mis sisaldab erandi üksikasju.

Allolev tabel näitab erandite objektide meetodeid.

Meetod Kirjeldus Näide
getMessage() Kuvab erandi sõnumi
<?php
echo $e->getMessage();
?>
saamaCode() 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();
?>
saamaTrace() Kuvab tagaosa massiivitrace enne erandit
<?php
print_r( $e->getTrace());
?>
getPrevious() Kuvab eelmise erandi enne praegust
<?php
echo $e->getPrevious();
?>
saamaTraceAsString() Näitab tagakülgetracerandi e stringina massiivi asemel
<?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 erandobjekti ja edastab sõnumiparameetrina stringi „See on erandi näide“.

Ülaltoodud kood väljastab järgmise teate.

PHP erandikäepide PHP-s

Nüüd vaatleme näidet, mis rakendab throw ja catch erandeid. Muudame ülaltoodud näidet ning lisame try, throw ja catch erandid.

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 lihtsat erandi näidet, kus on rakendatud käsud try, throw ja catch. Programm viskab tahtlikult erandi, mille see 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.phpSaate järgmised tulemused.

PHP erandikäepide PHP-s

Samuti on võimalik luua ühe PHP try-lause jaoks mitu erandit, olenevalt visatud erandi tüübist.

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

Mitu erandit

Mitme erandi korral kasutatakse väljavisatud erandite käsitlemiseks mitut catch-plokki. Mitmed erandid 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 mõttes kuvame oma catch-plokkides ainult erandi tüüpi. Erandite viskamiseks kasutatakse PHP sisseehitatud Exception-klassi. Loome kaks klassi, mis laiendavad Exception-klassi ja kasutame neid erandite viskamiseks.

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 multiple_exceptions.php faili phptuts kausta.

Sirvige jaotist URL 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 jaotist URL http://localhost/phptuts/multiple_exceptions.phpMis tulemused sa saad? Nüüd edasta parameetrina 3. Mis tulemused sa saad?

Finally Block ja PHP 7 veamudel

Tänapäeva PHP lisab ülaltoodud mudelile kaks olulist osa. Finally plokk käivitub pärast try ja catch käske olenemata sellest, kas tekkis erand, mis teeb selle ideaalseks puhastamiseks, näiteks faili või andmebaasiühenduse sulgemiseks.

Alates PHP 7-st visatakse paljud varasemad saatuslikud vead veaobjektidena. Nii Exception kui ka Error rakendavad Throwable'i liidest, seega catch (\Throwable $e) plokk saab hakkama mõlemaga.

<?php
try {
$result = 10 / 0;
} catch (DivisionByZeroError $e) {
echo "Caught: " . $e->getMessage();
} finally {
echo "This message always runs";
}
?>

Siin tekitab nulliga jagamine PHP 8-s DivisionByZeroError vea, catch plokk annab sellest teada ja finally plokk käivitub alati, näidates oma teadet, kas viga tekkis või mitte.

KKK

Tootmiskeskkonnas määra php.ini failis display_errors väärtuseks Off ja log_errors väärtuseks On ning suuna error_log faili. Kohandatud kirjete salvestamiseks ilma külastajatele midagi paljastamata võid kutsuda ka funktsiooni error_log('message').

try-catch käsitleb erandeid, mis visatakse märksõnaga throw. set_error_handler pealtkuulab traditsioonilisi PHP vigu ja hoiatusi. PHP 7-s ja uuemates versioonides visatakse paljud varasemad vead veaobjektidena, mida saate ka püüda.

Tabamata erand muutub saatuslikuks veaks, peatab skripti ja prindib pinuga teate „Tabamata erand”. trace. Globaalne käitleja, mille seadistuseks on set_exception_handler, suudab need viimase abinõuna kinni püüda.

Jah. Tehisintellekt saab riskantseid toiminguid mähkida try-catch plokkidesse, valida õiged erandite tüübid, lisada puhastamiseks finally ploki ja logida vea. RevVaadake, et see ei neela alla erandeid, mida peate nägema.

Jah. Kleebi sõnum ja trace, ja tehisintellekt suudab tuvastada rikkis liini, sinna viinud kõneahela ja tõenäolise põhjuse ning seejärel pakkuda välja paranduse, näiteks nullkontrolli või parandatud argumendi.

Võta see postitus kokku järgmiselt: