PHP Try Catch Eksempel: Undtagelses- og fejlhåndteringsvejledning
Hvad er en undtagelse?
En fejl er et uventet programresultat, der ikke kan håndteres af selve programmet.
Fejl løses ved at rette programmet. Et eksempel på en fejl ville være en uendelig løkke, der aldrig stopper med at udføre.
En undtagelse er uventede programresultater, der kan håndteres af selve programmet.
Eksempler på undtagelser omfatter forsøg på at åbne en fil, der ikke eksisterer.
Denne undtagelse kan håndteres ved enten at oprette filen eller give brugeren mulighed for at søge efter filen.
Hvorfor håndtere undtagelser?
- Undgå uventede resultater på vores sider, som kan være meget irriterende eller irriterende for vores slutbrugere
- Forbedre sikkerheden af vores applikationer ved ikke at afsløre oplysninger, som ondsindede brugere kan bruge til at angribe vores applikationer
- Php-undtagelser bruges til at ændre det normale flow af et program, hvis der opstår en forudsigelig fejl.
PHP Fejlhåndtering
Når der opstår en fejl, afhængigt af dine konfigurationsindstillinger, PHP viser fejlmeddelelsen i webbrowseren med information om den opståede fejl.
PHP tilbyder en række måder at håndtere fejl på.
Vi skal se på tre (3) almindeligt anvendte metoder;
- Dø erklæringer– matricefunktionen kombinerer ekko- og udgangsfunktionen i én. Det er meget nyttigt, når vi vil udskrive en besked og stoppe scriptudførelsen, når der opstår en fejl.
- Brugerdefinerede fejlbehandlere – disse er brugerdefinerede funktioner, der kaldes, når der opstår en fejl.
- PHP fejlrapportering – fejlmeddelelsen afhængigt af dine PHP-fejlrapporteringsindstillinger. Denne metode er meget nyttig i udviklingsmiljøer, når du ikke aner, hvad der forårsagede fejlen. De viste oplysninger kan hjælpe dig med at fejlsøge din applikation.
Fejlhåndtering af eksempler
Lad os nu se på nogle simple eksempler med fejlhåndteringsrutiner.
Lad os antage, at vi har udviklet et program, der bruger tekstfiler til at gemme data. Vi vil måske tjekke for filens eksistens, før vi forsøger at læse data fra den.
Koden nedenfor implementerer ovenstående eksempel.
<?php $denominator = 0; echo 2 / $denominator; ?>
Hvis du antager, at du har gemt filen simple_error.php i mappen phptuts, skal du åbne URL'en http://localhost/phptuts/simple_error.php
Du får følgende resultater
Som du kan se fra ovenstående resultater, får det vores applikation til at se uprofessionelt ud og kan være irriterende for brugeren.
Vi vil ændre ovenstående kode og skrive en fejlbehandler til applikationen
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
Forudsat at du har gemt ovenstående kode som error_handling.php, skal du åbne URL'en http://localhost/phptuts/error_handling.php
Bemærk: det er en god sikkerhedspraksis at vise en meddelelse som den, der er vist ovenfor i stedet for at vise meddelelsen som "Filen blev ikke fundet".
Lad os se på et andet eksempel, der bruger en brugerdefineret fejlbehandler.
Den brugerdefinerede fejlhåndtering vil blive indstillet som standard PHP fejlhåndteringsfunktion og vil grundlæggende vise et fejlnummer og en meddelelse.
Koden nedenfor illustrerer implementeringen af ovenstående eksempel
<?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); ?>
Åbn URL'en http://localhost/phptuts/custom_error_handler.php du får følgende resultater
Som du kan se fra ovenstående eksempel, er brugerdefinerede fejlbehandlere kraftfulde i den forstand, at
- De giver os mulighed for at tilpasse fejlmeddelelserne.
- Den brugerdefinerede fejlhåndtering kan også omfatte fejllogning i en fil/database, e-mail til udvikleren osv.
Lad os nu se på den tredje type fejlhåndtering. Vi vil bruge den indbyggede PHP funktion error_reporting funktion. Det har følgende grundlæggende syntaks
<?php error_reporting($reporting_level); ?>
HER,
- "error_reporting" er PHP-fejlrapporteringsfunktionen
- "$reporting_level" er valgfri, kan bruges til at indstille rapporteringsniveauet. Hvis der ikke er angivet et rapporteringsniveau, vil PHP bruge standardfejlrapporteringsniveauet som angivet i php.ini-filen.
Rapporteringsniveau | Description | Eksempel |
---|---|---|
E_ADVARSEL | Viser kun advarselsmeddelelser. Stopper ikke udførelsen af scriptet | fejlrapportering(E_WARNING); |
E_NOTICE | Viser meddelelser, der kan forekomme under normal afvikling af et program eller kan være en fejl. | error_reporting(E_ NOTICE); |
E_USER_ERROR | Viser brugergenererede fejl, dvs. brugerdefineret fejlbehandler | fejlrapportering(E_ USER_ERROR); |
E_USER_WARNING | Viser brugergenererede advarselsmeddelelser | fejlrapportering(E_USER_WARNING); |
E_USER_NOTICE | Viser brugergenererede meddelelser | fejlrapportering(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | Viser fejl, der ikke er fatale og kan håndteres ved hjælp af brugerdefinerede fejlbehandlere | error_reporting(E_RECOVERABLE_ERROR); |
E_ALLE | Viser alle fejl og advarsler | fejlrapportering(E_ ALL); |
Forskellen mellem fejl og undtagelser
- Undtagelser er smidt og beregnet til at blive fanget, mens fejl generelt er uoprettelige.
- Undtagelser håndteres på en objektorienteret måde. Dette betyder, når en undtagelse er kastet; der oprettes et undtagelsesobjekt, der indeholder undtagelsesdetaljerne.
Tabellen nedenfor viser undtagelsesobjektmetoderne
Metode | Description | Eksempel |
---|---|---|
getMessage () | Viser undtagelsens besked |
<?php echo $e->getMessage(); ?> |
få kode() | Viser den numeriske kode, der repræsenterer undtagelsen |
<?php echo $e->getCode(); ?> |
getFile() | Viser filnavnet og stien, hvor undtagelsen opstod |
<?php echo $e->getFile(); ?> |
getLine() | Viser linjenummeret, hvor undtagelsen fandt sted |
<?php echo $e->getLine(); ?> |
getTrace() | Viser et array af tilbagesporingen før undtagelsen |
<?php print_r( $e->getTrace()); ?> |
getPrevious() | Viser den forrige undtagelse før den nuværende |
<?php echo $e->getPrevious(); ?> |
getTraceAsString() | Viser tilbagesporingen af undtagelsen som en streng i stedet for en matrix |
<?php echo $e->getTraceAsString(); ?> |
__toString() | Viser hele undtagelsen som en streng |
<?php echo $e->__toString(); ?> |
Nedenfor er den grundlæggende syntaks for at kaste en undtagelse.
<?php throw new Exception("This is an exception example"); ?>
HER,
- "kast" er nøgleordet, der bruges til at kaste undtagelsen
- "ny undtagelse(...)" opretter et undtagelsesobjekt og sender strengen "Dette er et undtagelseseksempel" som beskedparameter.
Ovenstående kode udsender følgende meddelelse.
Vi skal nu se på et eksempel, der implementerer kast og fang undtagelser.
Vi vil ændre ovenstående eksempel og inkludere try, throw og catch.
Det har følgende grundlæggende syntaks.
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
HER,
- "try{...}" er den kodeblok, der skal udføres, som potentielt kan give anledning til en undtagelse
- "catch(Exception $e){...}" er den kodeblok, der fanger den kastede undtagelse og tildeler undtagelsesobjektet til variablen $e.
Koden nedenfor viser det grundlæggende undtagelseseksempel med try, throw og catch undtagelsen implementeret.
Programmet kaster bevidst en undtagelse, som det så fanger.
<?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(); } ?>
Åbn URL'en http://localhost/phptuts/exception_handling.php Du får følgende resultater.
Det er også muligt at oprette flere undtagelser for en php try-sætning afhængigt af typen af undtagelse.
Se artiklen vedr MySQL, PHP-dataadgang... for implementeringseksempler på flere undtagelser
Flere undtagelser
Flere undtagelser bruger multiple try catch-blokke til at håndtere de kastede undtagelser. Flere undtagelser er nyttige, når;
- Du ønsker at vise en tilpasset besked afhængigt af undtagelsen
- Du ønsker at udføre en unik operation afhængigt af den afgivne undtagelse
Flowdiagrammet nedenfor illustrerer, hvordan flere undtagelser fungerer
Lad os se på et eksempel, der bruger flere undtagelser.
Vi vil ændre koden, der dividerer et tal med den beståede nævner.
Vi forventer, at der forekommer to typer undtagelser;
- Division med nul
- Division med et negativt tal
For nemheds skyld vil vi kun vise undtagelsestypen i vores catch-blokke.
PHP indbygget i Exception-klassen bruges til at kaste undtagelser.
Vi vil oprette to klasser, der udvider undtagelsesklassen og bruger dem til at kaste undtagelser.
Koden nedenfor viser implementeringen.
<?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); ?>
Test af koden
Vi antager, at du har gemt multiple_exceptions.php i mappen phptuts.
Gå til URL'en http://localhost/phptuts/multiple_exceptions.php
Skift tilbage til PHP-filen og send -1 som parameter som vist i følgende diagram.
Gå til URL'en http://localhost/phptuts/multiple_exceptions.php.
Hvilke resultater får du? Bestå 3 som parameter.
Hvilke resultater får du?
Resumé
- Fejl er uventede resultater produceret af PHP-kode
- Fejlhåndtering forbedrer applikationens ydeevne
- PHP har indbygget funktioner, der kan bruges til at tilpasse den måde, PHP rapporterer fejl på
- Undtagelser er ligesom fejl, men de kan fanges ved hjælp af catch-blokken, når de kastes.
- Visning af fejlmeddelelser, der viser fejlinformation, betragtes som en dårlig sikkerhedspraksis.