PHP Try Catch-voorbeeld: zelfstudie over uitzonderingen en foutafhandeling

โšก Slimme samenvatting

Foutafhandeling en uitzonderingen in PHP zorgen ervoor dat applicaties stabiel en veilig blijven door onverwachte situaties af te handelen in plaats van fouten direct weer te geven. Deze handleiding legt het verschil uit tussen fouten en uitzonderingen, `die`-instructies, aangepaste foutafhandelaars, foutrapportageniveaus en het `try`, `throw` en `catch` uitzonderingsmodel met meerdere uitzonderingstypen.

  • โš ๏ธ Fout versus uitzondering: Een fout is over het algemeen onherstelbaar, terwijl een uitzondering een onverwacht resultaat is dat het programma kan opvangen en afhandelen.
  • ๐Ÿ›ก๏ธ Waarom deze handgreep gebruiken? Foutafhandeling voorkomt ongewenste uitvoer, beschermt gebruikers en voorkomt dat gegevens uitlekken die aanvallers zouden kunnen misbruiken.
  • ๐Ÿ›‘ Sterfverklaringen: De functie `die` print een bericht en stopt het script; een snelle manier om de uitvoering te stoppen als er iets misgaat.
  • ๏ธ Aangepaste handlers: set_error_handler() stuurt fouten door naar je eigen functie, zodat je berichten kunt loggen, e-mailen of formatteren zoals jij dat wilt.
  • ๐Ÿ“ข Foutmelding: error_reporting() en niveaus zoals E_ALL bepalen welke waarschuwingen en meldingen PHP weergeeft, wat handig is tijdens de ontwikkeling.
  • ๐Ÿงฒ Probeer, gooi, vang: Een `try`-blok voert risicovolle code uit, `throw` genereert een uitzondering en `catch` handelt deze af met behulp van de methoden van het uitzonderingsobject.
  • ๐Ÿค– AI-assistentie: AI-tools kunnen try-catch-afhandeling toevoegen aan bestaande code en een verwarrende stacktrace verklaren. trace of foutmelding.

Foutafhandeling en uitzonderingen in PHP

Wat is een uitzondering?

Een fout is een onverwacht programmaresultaat dat niet door het programma zelf kan worden afgehandeld.

Fouten worden opgelost door het programma te repareren. Een voorbeeld van een fout is een oneindige lus die nooit stopt met uitvoeren.

Een uitzondering is een onverwacht programmaresultaat dat door het programma zelf kan worden afgehandeld.

Een voorbeeld van een uitzondering is het proberen een bestand te openen dat niet bestaat.

Deze uitzondering kan worden opgelost door het bestand aan te maken of door de gebruiker de mogelijkheid te bieden om naar het bestand te zoeken.

Waarom uitzonderingen afhandelen?

  • Voorkom onverwachte resultaten op onze pagina's, die zeer vervelend of irritant kunnen zijn voor onze gebruikers.
  • Verbeter de beveiliging van onze applicaties door geen informatie vrij te geven die kwaadwillende gebruikers kunnen gebruiken om onze applicaties aan te vallen
  • PHP-uitzonderingen worden gebruikt om de normale programmastroom te wijzigen als er een voorspelbare fout optreedt.

PHP-foutafhandeling

Wanneer er een fout optreedt, afhankelijk van uw configuratie-instellingen, PHP geeft de foutmelding in de webbrowser weer met informatie over de opgetreden fout.

PHP biedt verschillende manieren om fouten af โ€‹โ€‹te handelen. We gaan drie veelgebruikte methoden bekijken:

  1. Die uitspraken De functie `die` combineert de functies `echo` en `exit` in รฉรฉn. Deze functie is erg handig wanneer we een bericht willen weergeven en de scriptuitvoering willen stoppen als er een fout optreedt.
  2. Aangepaste foutafhandelaars โ€“ dit zijn door de gebruiker gedefinieerde functies die worden aangeroepen wanneer er een fout optreedt.
  3. PHP-foutrapportage โ€“ Het foutbericht is afhankelijk van je PHP-foutrapportage-instellingen. Deze methode is erg handig in een ontwikkelomgeving wanneer je geen idee hebt wat de fout veroorzaakt. De weergegeven informatie kan je helpen bij het debuggen van je applicatie.

Voorbeelden van foutafhandeling

Laten we nu eens kijken naar enkele eenvoudige voorbeelden met foutafhandelingsroutines.

Stel dat we een berekening hebben waarbij een getal door nul gedeeld kan worden. We willen dat geval netjes afhandelen in plaats van dat PHP een foutmelding geeft.

De onderstaande code implementeert het bovenstaande voorbeeld.

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

Als je het bestand simple_error.php in de map phptuts hebt opgeslagen, open dan het bestand. URL http://localhost/phptuts/simple_error.php

U krijgt de volgende resultaten.

PHP-foutafhandeling

Zoals u uit de bovenstaande resultaten kunt zien, zorgt dit ervoor dat onze applicatie er onprofessioneel uitziet en vervelend kan zijn voor de gebruiker.

We zullen de bovenstaande code aanpassen en een foutafhandeling voor de applicatie schrijven.

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

Als je de bovenstaande code hebt opgeslagen als error_handling.php, open dan het bestand URL http://localhost/phptuts/error_handling.php

PHP-uitzonderingshandle in PHP

Let op: Het is een goede beveiligingspraktijk om een โ€‹โ€‹bericht zoals hierboven weergegeven weer te geven in plaats van een onbewerkte melding zoals "Bestand niet gevonden".

Laten we eens kijken naar een ander voorbeeld waarin een aangepaste foutafhandelaar wordt gebruikt.

De aangepaste foutafhandelaar wordt ingesteld als de standaard PHP-foutafhandelingsfunctie en geeft in principe een foutnummer en bericht weer.

De onderstaande code illustreert de implementatie van het bovenstaande voorbeeld.

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

Open de URL http://localhost/phptuts/custom_error_handler.phpU krijgt de volgende resultaten.

PHP-foutafhandeling

Zoals je in het bovenstaande voorbeeld kunt zien, zijn aangepaste foutafhandelaars krachtig in de volgende zin:

  • Ze stellen ons in staat de foutmeldingen aan te passen.
  • De aangepaste foutafhandeling kan ook het vastleggen van fouten in een bestand of database, het versturen van een e-mail naar de ontwikkelaar en soortgelijke acties omvatten.

Laten we nu kijken naar het derde type foutafhandeling. We gaan hiervoor de ingebouwde PHP-functie `error_reporting` gebruiken. Deze heeft de volgende basissyntaxis.

<?php
error_reporting($reporting_level);
?>

HIER,

  • โ€œerror_reportingโ€ is de PHP-foutrapportagefunctie
  • โ€œ$reporting_levelโ€ is optioneel en kan worden gebruikt om het rapportageniveau in te stellen. Als er geen rapportageniveau is opgegeven, gebruikt PHP het standaard foutrapportageniveau zoals gespecificeerd in het php.ini-bestand.
Rapportageniveau Beschrijving Voorbeeld
E_WAARSCHUWING Geeft alleen waarschuwingsberichten weer. Stopt de uitvoering van het script niet error_reporting(E_WARNING);
E_NOTICE Geeft mededelingen weer die kunnen optreden tijdens de normale uitvoering van een programma of die een fout kunnen zijn. foutrapportage(E_NOTICE);
E_USER_ERROR Geeft door de gebruiker gegenereerde fouten weer, oftewel een aangepaste foutafhandeling. error_reporting(E_USER_ERROR);
E_USER_WAARSCHUWING Geeft door de gebruiker gegenereerde waarschuwingsberichten weer foutrapportage(E_USER_WARNING);
E_USER_NOTICE Toont door de gebruiker gegenereerde mededelingen foutrapportage(E_USER_NOTICE);
E_RECOVERABLE_ERROR Geeft fouten weer die niet fataal zijn en die kunnen worden afgehandeld met behulp van aangepaste foutafhandelaars. foutrapportage (E_RECOVERABLE_ERROR);
E_ALLE Toont alle fouten en waarschuwingen foutrapportage(E_ALL);

Verschil tussen fouten en uitzonderingen

  • Uitzonderingen worden gegenereerd en zijn bedoeld om te worden opgevangen, terwijl fouten over het algemeen onherstelbaar zijn.
  • Uitzonderingen worden objectgeoriรซnteerd afgehandeld. Dit betekent dat wanneer een uitzondering optreedt, er een uitzonderingsobject wordt aangemaakt dat de details van de uitzondering bevat.

De onderstaande tabel toont de methoden van het exception-object.

Methode Beschrijving Voorbeeld
GetMessage () Geeft het bericht van de uitzondering weer
<?php
echo $e->getMessage();
?>
krijgenCode() Geeft de numerieke code weer die de uitzondering vertegenwoordigt
<?php
echo $e->getCode();
?>
haalBestand() Toont de bestandsnaam en het pad waar de uitzondering heeft plaatsgevonden
<?php
echo $e->getFile();
?>
haalLijn() Geeft het regelnummer weer waarop de uitzondering heeft plaatsgevonden
<?php
echo $e->getLine();
?>
krijgenTrace() Geeft een reeks van de achterkant weertrace vรณรณr de uitzondering
<?php
print_r( $e->getTrace());
?>
krijgVorige() Toont de vorige uitzondering vรณรณr de huidige
<?php
echo $e->getPrevious();
?>
krijgenTraceAsString() Toont de achterkanttrace van de uitzondering als een tekenreeks in plaats van een array
<?php
echo $e->getTraceAsString();
?>
__toString() Geeft de volledige uitzondering weer als een tekenreeks
<?php
echo $e->__toString();
?>

Hieronder vindt u de basis-syntaxis voor het genereren van een uitzondering.

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

HIER,

  • 'gooien' is het sleutelwoord dat wordt gebruikt om de uitzondering te genereren
  • โ€œnew Exception(โ€ฆ)โ€ maakt een exception-object aan en geeft de tekenreeks โ€œDit is een voorbeeld van een uitzonderingโ€ door als berichtparameter.

De bovenstaande code genereert het volgende bericht.

PHP-uitzonderingshandle in PHP

We gaan nu kijken naar een voorbeeld waarin de `throw` en `catch` uitzonderingen worden geรฏmplementeerd. We zullen het bovenstaande voorbeeld aanpassen en `try`, `throw` en `catch` toevoegen.

De basissyntaxis is als volgt.

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

HIER,

  • โ€œtry{โ€ฆ}โ€ is het codeblok dat moet worden uitgevoerd en dat mogelijk een uitzondering kan opleveren
  • โ€œcatch(Exception $e){โ€ฆ}โ€ is het codeblok dat de gegenereerde uitzondering opvangt en het uitzonderingsobject toewijst aan de variabele $e.

De onderstaande code toont een eenvoudig voorbeeld van een exception met `try`, `throw` en `catch`. Het programma gooit opzettelijk een exception, die het vervolgens opvangt.

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

Open de URL http://localhost/phptuts/exception_handling.phpU krijgt de volgende resultaten.

PHP-uitzonderingshandle in PHP

Het is ook mogelijk om meerdere uitzonderingen te creรซren voor รฉรฉn PHP try-statement, afhankelijk van het type uitzondering dat wordt gegenereerd.

Zie het artikel op MySQLPHP-gegevenstoegang voor implementatievoorbeelden van meerdere uitzonderingen.

Meerdere uitzonderingen

Meerdere uitzonderingen maken gebruik van meerdere catch-blokken om de gegenereerde uitzonderingen af โ€‹โ€‹te handelen. Meerdere uitzonderingen zijn nuttig wanneer:

  • U wilt een aangepast bericht weergeven, afhankelijk van de gegenereerde uitzondering
  • U wilt een unieke bewerking uitvoeren, afhankelijk van de uitzondering die is gegenereerd

Het onderstaande stroomdiagram illustreert hoe meerdere uitzonderingen werken.

Meerdere uitzonderingen

Laten we eens kijken naar een voorbeeld met meerdere uitzonderingen. We zullen de code aanpassen die een getal deelt door de meegegeven noemer.

We verwachten dat er twee soorten uitzonderingen zullen optreden:

  • Deling door nul
  • Delen door een negatief getal

Om het eenvoudig te houden, zullen we in onze catch-blokken alleen het uitzonderingstype weergeven. De ingebouwde PHP-klasse `Exception` wordt gebruikt om uitzonderingen te gooien. We zullen twee klassen maken die de `Exception`-klasse uitbreiden en deze gebruiken om uitzonderingen te gooien.

Onderstaande code toont de implementatie.

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

Het testen van de code

We gaan ervan uit dat je multiple_exceptions.php in de phptuts-map hebt opgeslagen.

Blader naar het URL http://localhost/phptuts/multiple_exceptions.php

PHP-uitzonderingshandle in PHP

Ga terug naar het PHP-bestand en geef -1 op als parameter, zoals weergegeven in het volgende diagram.

PHP-uitzonderingshandle in PHP

Blader naar het URL http://localhost/phptuts/multiple_exceptions.phpWelke resultaten krijg je? Geef nu 3 als parameter door. Welke resultaten krijg je?

Het finally-blok en het PHP 7-foutmodel

Moderne PHP voegt twee belangrijke elementen toe aan het bovenstaande model. Het finally-blok wordt uitgevoerd na try en catch, ongeacht of er een uitzondering is opgetreden. Dit maakt het ideaal voor opruimacties zoals het sluiten van een bestand of een databaseverbinding.

Sinds PHP 7 worden veel voorheen fatale fouten als Error-objecten doorgegeven. Zowel Exception als Error implementeren de Throwable-interface, waardoor een catch (\Throwable $e)-blok beide kan afhandelen.

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

Hier geeft delen door nul een DivisionByZeroError in PHP 8. Het catch-blok meldt dit, en het finally-blok wordt altijd uitgevoerd en print zijn bericht, ongeacht of er een fout is opgetreden.

Veelgestelde vragen

Stel in een productieomgeving `display_errors` in op `Off` en `log_errors` op `On` in `php.ini`, en laat `error_log` verwijzen naar een bestand. Je kunt ook `error_log('message')` aanroepen om aangepaste berichten vast te leggen zonder dat bezoekers deze te zien krijgen.

`try-catch` behandelt uitzonderingen die worden gegooid met het `throw`-keyword. `set_error_handler` onderschept traditionele PHP-fouten en -waarschuwingen. In PHP 7 en later worden veel van de vroegere fouten gegooid als `Error`-objecten die je ook kunt opvangen.

Een niet-afgevangen uitzondering wordt een fatale fout, stopt het script en print een bericht met de tekst "Uncaught Exception" en een stacktrace. trace. Een globale handler die is ingesteld met set_exception_handler kan deze als laatste redmiddel opvangen.

Ja. AI kan risicovolle bewerkingen in try-catch-blokken plaatsen, de juiste uitzonderingstypen selecteren, een finally-blok toevoegen voor opruiming en de fout loggen. RevHet is belangrijk om te weten dat het geen uitzonderingen negeert die je wel moet zien.

Ja. Plak het bericht en tracEn AI kan de foutieve regel identificeren, de aanroepketen die daartoe heeft geleid en de waarschijnlijke oorzaak, en vervolgens een oplossing voorstellen, zoals een null-controle of een gecorrigeerd argument.

Vat dit bericht samen met: