PHP õppetunnid: vigade ja tõrkekäsitluse kuvamine

PHP on tänapäeval kõige populaarsem serveripoolne veebiprogrammeerimiskeel, seetõttu on oluline teada, kuidas lahendada kõik probleemid, mis võivad tekkida teie PHP-koodi käivitamisel.


Käesolevas artiklis vaatleme põhitõdesid, kuidas PHP-s veahaldust teha, kasutades sisseehitatud funktsioone, kirjutades kohandatud veakäsitleja funktsioone ja erandiga veakäsitlust.

PHP vigade tüübid

Tarkvaras on kahte tüüpi vigu:

  • Sisemised vead: Need on teie koodi loogikavead. Neid vigu saab väga suures ulatuses vältida hoolika programmeerimisega.
  • Välised vead: Need on vead, mis on seotud teie koodivälise maailmaga toimuvaga (nt faili või andmebaasi avamata jätmine, võrguühenduse katkemine, teatud PHP-mooduli laadimata jätmine jne). Neid vigu esineb alati, kuid nende mõju saab leevendada. Mida paremini te nende väliste tõrgete jaoks koodi ette valmistate, eeldades, et teie kood käivitatakse võimalikult vähe, seda vähem mõjutavad need vead teie programmi negatiivselt.

Võimalused PHP-tõrgetega toimetulemiseks

Kui vead on ilmnenud ja me need tuvastame, on neli peamist viisi nende lahendamiseks:

  • Kuva tõrge: See võimaldab programmi käivitamisel tõrke näidata arendajale ja / või kasutajale.
  • Logi viga: See võimaldab vigu salvestada ja tekstilisest logifailist üle vaadata.
  • Tegutsege vea eest: Vajalike toimingute tüüp on igas programmisituatsioonis erinev.
  • Ignoreerige viga: Seda tuleks alati vältida.

Selles artiklis keskendume vigade kuvamisele, logimisele ja käsitlemisele. Kui teate, kuidas vigu käsitleda, saate nendega hõlpsalt tegutseda.

Vigade ja tõrketeadete seadete kuvamine

Sõltuvalt sellest, kas meil on kood tootmisel või väljatöötamisel, võiksime teatud tüüpi vigadest teatamise sisse või välja lülitada.

Asukohti, kus saame kontrollida, milliseid veatüüpe tuleb teatada, on erinevates kohtades:

  • Failis php.ini
  • Veebiserveri failis .htaccess
  • Teie enda PHP-koodilt.

PHP-vea konfiguratsiooniväärtuste täieliku kirjelduse leiate siit. Need on vaikeväärtusega kõige olulisemad valikud:

PHP-vigade kuvamise valikud

PHP vigade kuvamiseks on neli võimalust:

  • veaaruanne: Määrake veateate tase. Vaikeväärtus on: “E_ALL & ~ E_NOTICE & ~ E_STRICT & ~ E_DEPRECATED ”, mis tähendab, et see säte ei näita taseme vigu E_NOTICE, E_STRICT ja E_DEPRECATED.
  • kuva_vead: Kui vead prinditakse ekraanile, valige see olekus “ON” (vaikeseade on “OFF”).
  • logi vead: See näitab, kas tuleks tõrke logimist teha või mitte; vaikeväärtus on “sees”.
  • vea logi string: Määrab faili nime, kuhu tuleks skriptivead logida

Vaatame, kuidas neid konfiguratsiooni valikuid kasutada.

Arenduse ajal võiksime keelata kogu veaaruandluse php.ini-st:

1
2

display_errors = sees

error_reporting = E_ALL

Sama saaksime teha ka meie PHP-koodi abil käitusajal, kutsudes funktsiooni error_reporting ():

1 tõrketeade (E_ALL);

Vea logimise sisselülitamiseks ja vigade logimiseks meie enda konkreetsesse logifaili (vaikimisi tõrke logifaili asemel, mis sageli on veebiserveri vealogifail või syslog-fail) võiksime PHP konfigureerida:

1
2

log_errors = sees

viga_logi = "/tmp/php-error.log"

Nüüd saate vigu logida oma PHP-koodi kaudu:

1 veapäevik ( "Selles koodis on vigu!" );

Sisseehitatud veatasemed

PHP-l on praegu 15 etteantud veakonstanti, millest igaühel on oma identifitseerimisnumber (bitmaski). Need on sisseehitatud veatüübid, mida PHP või teie, arendaja, võivad tõrke ilmnemisel käivitada. Nagu näeme järgmises jaotises, saate otsustada, millistest veatüüpidest soovite teatada.

Need on sisseehitatud PHP veatüübid:

Tüüp
Kirjeldus
E_ERRORSaatuslikud käitusaja vead
E_HOIATUSKäitusaja hoiatused (mitte-fataalsed vead)
E_PARSEKompileerimisaja sõelvead
E_NOTICEKestus teated
E_CORE_ERRORFataalsed vead, mis ilmnevad PHP esmasel käivitamisel
E_CORE_WARNINGHoiatused (mittefataalsed vead), mis ilmnevad PHP esmasel käivitamisel
E_COMPILE_ERRORSaatuslikud kompileerimise aja vead
E_COMPILE_WARNINGKoostatud aja hoiatused (mitte-fataalsed vead)
E_USER_ERRORKasutaja loodud veateade
E_USER_WARNINGKasutaja loodud hoiatusteade
E_USER_NOTICEKasutaja loodud teatesõnum
E_STRICTLuba PHP-l soovitada muudatusi oma koodis, mis tagab teie koodi parima koostalitlusvõime ja edasise ühilduvuse
E_RECOVERABLE_ERRORSaavutatav saatuslik viga
E_DEPRECATEDKestus teated
E_USER_DEPRECATEDKasutaja loodud hoiatusteade
E_ALLKõik toetatud vead ja hoiatused

Siin on mõned koodinäited nende veakonstantide käivitamisest:

1
2
3
4
5
6
7
8
9
10
11
12
13

// E_ERROR

nonExistingFunction ();

 
// E_HOIATUS

$ fh = fopen (‘puudub-fail’, ‘r’);

 
// E_NOTICE

$ x = $ y + 5; // $ y polnud määratletud

 
// E_USER_ERROR

if ($ jagaja == 0) {

    trigger_error ("Ei saa nulliga jagada", E_USER_ERROR); // arendaja poolt käivitatud viga

}

Kohandatud veakäitlejate loomine

Nüüd, kui saame PHP-d konfigureerida, et öelda, millist tüüpi vigadest teatada, peame suutma erinevaid veatüüpe omal moel käsitseda. Lihtsalt tavaliste PHP-tõrketeadete kuvamine pole sageli piisavalt hea.

Soovime tõrkega hakkama saada ja tõrke ilmnemisel kuvada oma sõnumeid. Selleks võime kasutada funktsiooni set_error_handler ().

Siin on väga lihtne kohandatud vigade käsitlemise funktsioon:

1
2
3
4
5
6
7
8
9
10

// veakäitleja funktsioon

funktsioon errorHandler ($ errno, $ errstr) {

  kaja "Viga: [$ errno] $ errstr";

}
 
// määrake veakäsitleja

set_error_handler ("vigaHandler");

 
// vallandab tõrke

kaja ($ foo); // määratlematu muutuja!

Nii et kui ilmneb tõrge, kutsutakse kohandatud veakäsitleja funktsioon koos veanumbri argumendi ja vea stringi argumendiga. Need kaks argumenti antakse set_error_handler () kutsest meie funktsiooni.

Nagu varsti näeme, on veel argumente, mida saaksime kasutada, kuid selle koodi käivitamine oleks järgmine:

1 Viga: [8] määratlematu muutuja: foo

Vaatame, milline võiks välja näha veidi vähem lihtne kohandatud vigade käsitlemise funktsioon. See veakäsitleja peaks suutma tuvastada veatüübid ja otsustada, mida teha ja / või millist veateadet näidata.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

funktsioon errorHandler ($ errno, $ errstr, $ errfile, $ errline) {

 

    lüliti ($ errno) {

        juhtum E_NOTICE:

        juhtum E_USER_NOTICE:

        juhtum E_DEPRECATED:

        juhtum E_USER_DEPRECATED:

        juhtum E_STRICT:

            kaja ("STRICT viga $ errstr juures $ errfile: $ errline n");

            vaheaeg;

 

        juhtum E_WARNING:

        juhtum E_USER_WARNING:

            kaja ("HOIATUS viga $ errstr juures $ errfile: $ errline n");

            vaheaeg;

 

        juhtum E_ERROR:

        juhtum E_USER_ERROR:

        juhtum E_RECOVERABLE_ERROR:

            väljumine ("FATAL viga $ errstr juures $ errfile: $ errline n");

 

        vaikimisi:

            väljumine ("Tundmatu viga aadressil $ errfile: $ errline n");

    }

}
 

set_error_handler ("vigaHandler");

 

$ foo = vale;

 

if (! $ foo) {

   trigger_error (‘Väärtus $ foo peab olema tõene’, E_USER_NOTICE);

}

Pange tähele, kuidas me rühmitame teatud veatüüpide käsitlemise, kasutades juhtumikirjelduste langusfunktsiooni.

Väljund oleks midagi sellist:

1 STRICT viga Väärtus $ foo peab vastama tõele aadressil /tmp/test.php:32

Nüüd saate veatüüpe käsitleda erinevalt (või sama) ja näidata ka kohandatud veateadet. Muidugi peaks tõeline kohandatud tõrkekäsitlusfunktsioon suutma vigadega palju rohkem hakkama saada ja võib-olla nende abil konkreetsel ja mõistlikul viisil tegutseda.

Oluline on hoida oma kohandatud tõrkekäsitlusfunktsioon lihtsana ja töökindlana, et vältida selle funktsiooni sees vigu, kuna neist ei teatata. On mitmeid PHP teeke, mis aitavad teil täpsemat tõrkekäsitlust luua.

PHP erandite kasutamine

PHP versioon 5 tutvustas veel ühte vigade käsitlemise viisi: erandid.

Erandkäsitsemist kasutatakse käitusprogrammi tavapärase voo muutmiseks, kui ilmneb määratletud tõrgetingimus. See on rohkem keele-süntaksiga integreeritud vigade käsitlemise viis kui kohandatud vigade käsitlemise funktsioonide kirjutamine.

Erandeid esindab PHP-s klass Erand. Erandid tehakse süntaksi „viska” abil ja neid saab püüda süntaksiploki „proovida / püüda” abil. Kõik koodid, milles võib esineda tõrkevigu, tuleks panna prooviplokki, millele võib tõrke tegemiseks järgneda püügiplokk. Kuna visatud erandid mullitavad koodivirna, saavad neid käsitleda ka muud koodis olevad „püügi” plokid.

See näeb välja erandi süntaks:

1
2
3
4
5
6
7
8
9
10
11
12

try {// viska prooviblokis vigu

 

    // kui ilmneb tõrge, võime erandi teha

    loobu uus erand (‘see on viga.’);

 
}

saak (erand $ e) {// püüdma viskeid püüdmisplokis

 

    // teha midagi erandobjektiga, nt. kuva selle sõnum

    echo ‘Veateade:’. $ e->getMessage ();

 
}

Milline väljund:

1 Tõrketeade: see on tõrge.

Pärast erandobjekti viskamist pääseme juurde järgmistele liikmefunktsioonidele:

  • getMessage () saab erandi teate
  • getPrevable () tagastab eelmise erandi
  • getCode () saab erandkoodi
  • getFile () saab faili, milles erand tehti
  • getLine () saab rea, milles erand tehti
  • getTrace () saab virna jälje
  • getTraceAsString () saab virna jälje stringina
  • __toString () on erandi stringi esitus
  • __ kloon () kloonib erandi

Siin on veel üks näide erandite käsitlemise kohta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ fail = ‘/tmp/foo.txt’;

 

proovige {

    // kontrollige, kas fail on olemas ja kas see on kirjutatav

    if (! fail_eksisteerib ($ fail) ||! on kirjutatav ($ fail)) {

 

        // kui mitte: visake erand

        viska uus erand (‘File’. $ file. ‘ei leitud või pole kirjutatav.’);

 

        echo (‘kas kood jõuab siia?’); // mitte siis, kui varem visati erand

    }

}

saak (erand $ e) {

    echo ‘Veateade:’. $ e->getMessage ();

    tagastama vale;

}

Kui käivitate selle koodi ilma faili esmalt loomata, kuvatakse järgmine tõrge:

1 Veateade: faili /tmp/foo.txt ei leitud või seda ei saa kirjutada.

Erandid mullitavad koodivirna üles, nii et meil võib olla mitu viskelahendust erinevates koodiplokkides ja käsitleme neid siiski nõtkelt. Kõik erandid, mis visatakse, kuid ei püüta, tekitavad E_FATAL-i veateate teatega „Tabamata erand”.

Näide:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

$ foo = 10;

 

proovige {

    if (on_numbriline ($ foo)) {

        if ($ foo > 5) {

            loobu uus erand (‘number on liiga suur’); // see visatakse

        }

    }

    veel {

        loobu uus erand (‘mitte numbriliik’);

    }

}

saak (erand $ e) {

    echo ‘Veateade:’. $ e->getMessage (). ‘reas:’. $ e->getLine ();

    // tagasta vale;

}

Pange tähele, et me kutsusime “$ e->getLine () ”erandobjekti liikmefunktsioon, et saada rea ​​number, kui erand visati.

Võimalik on üksteise sisse pesa mitu proovivõtuplokki. See võimaldab teil määrata, millist erandit käsitlevat viga käsitletakse (puhtal ja lihtsal viisil) oma koodi kohas, kus see on kõige mõistlikum. Pidage alati meeles, et pange alati kood, mis viskab prooviploki.

Kohandatud erandite käsitlejad

Siiani oleme kasutanud sisseehitatud erandiklassi, kuid saame ka kirjutada oma kohandatud erandite käitleja, laiendades sisseehitatud erandiklassi. See on kasulik, kui soovime sisseehitatud liikmefunktsioonid alistada või uusi liikmesfunktsioone lisada. Siin näete mitmeid põhjalikke koodinäiteid.

Erinevus standardvigade ja erandite vahel

Tavaline vigade käsitlemine on vanem viis vigade käsitlemiseks PHP-s. Erandite käsitlemine on saadaval ainult alates PHP 5-st ja nõuab objektorienteeritud programmeerimisstruktuuri kasutamist.

Mõlemat saab kasutada üksteise kõrval. Tegelikult loob iga erand, mis visatakse, kuid ei püüta, lõpuks E_FATAL-i tõrke teatega „Tabamata erand”.

Allpool näidatud funktsioonikoodi näitega set_error_handler () saaksime erandina käsitleda isegi kõiki standardseid vigu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

set_error_handler (funktsioon ($ errno, $ errstr, $ errfile, $ errline) {

    if (error_reporting ()) {

        viska uus ErrorException ($ errstr, 0, $ errno, $ errfile, $ errline);

    }

});

 

proovige {

    // E_HOIATUS

    $ fh = fopen (‘puudub-fail’, ‘r’);

}

saak (erand $ e) {

    echo ‘Veateade:’. $ e->getMessage ();

    tagastama vale;

}

Lõppsõna

Loodan, et see kiire sissejuhatus PHP tõrkekäsitlusse on aidanud teil mõista seda olulist osa arengust. Nüüd peaksite teadma, kuidas vigu kuvada ja logida ning käsitseda neid erinevatel viisidel, mida PHP võimaldab, kas kohandatud vigade käsitlemise funktsiooni või erandkäsitluse abil.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me