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.

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:
- 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.
- Kohandatud veakäsitlejad – need on kasutaja määratletud funktsioonid, mis kutsutakse välja iga kord, kui ilmneb tõrge.
- 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.
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
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.
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.
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.
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.
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
Lülitage tagasi PHP-failile ja sisestage parameetriks -1, nagu on näidatud järgmisel diagrammil.
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.








