PHP Try Catch Eksempel: Opplæring for unntak og feilhåndtering

Hva er et unntak?

En feil er et uventet programresultat som ikke kan håndteres av selve programmet.

Feil løses ved å fikse programmet. Et eksempel på en feil vil være en uendelig sløyfe som aldri slutter å kjøre.

Et unntak er uventede programresultater som kan håndteres av selve programmet.

Eksempler på unntak inkluderer forsøk på å åpne en fil som ikke eksisterer.

Dette unntaket kan håndteres ved enten å opprette filen eller gi brukeren muligheten til å søke etter filen.

Hvorfor håndtere unntak?

  • Unngå uventede resultater på sidene våre som kan være svært irriterende eller irriterende for sluttbrukerne våre
  • Forbedre sikkerheten til applikasjonene våre ved ikke å avsløre informasjon som ondsinnede brukere kan bruke til å angripe applikasjonene våre
  • Php-unntak brukes til å endre den normale flyten til et program hvis det oppstår en forutsigbar feil.

PHP Feilhåndtering

Når det oppstår en feil, avhengig av konfigurasjonsinnstillingene, PHP viser feilmeldingen i nettleseren med informasjon knyttet til feilen som oppstod.

PHP tilbyr en rekke måter å håndtere feil på.

Vi skal se på tre (3) ofte brukte metoder;

  1. Dø uttalelser– dysefunksjonen kombinerer ekko- og utgangsfunksjonen i ett. Det er veldig nyttig når vi ønsker å sende ut en melding og stoppe skriptkjøringen når det oppstår en feil.
  2. Egendefinerte feilbehandlere – dette er brukerdefinerte funksjoner som kalles opp hver gang det oppstår en feil.
  3. PHP feilrapportering – feilmeldingen avhengig av PHP-feilrapporteringsinnstillingene. Denne metoden er veldig nyttig i utviklingsmiljøer når du ikke aner hva som forårsaket feilen. Informasjonen som vises kan hjelpe deg med å feilsøke applikasjonen.

Feilhåndtering av eksempler

La oss nå se på noen enkle eksempler med feilhåndteringsrutiner.

La oss anta at vi har utviklet en applikasjon som bruker tekstfiler til å lagre data. Vi vil kanskje sjekke om filen eksisterer før vi prøver å lese data fra den.

Koden nedenfor implementerer eksemplet ovenfor.

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

Forutsatt at du har lagret filen simple_error.php i phptuts-mappen, åpne URL-en http://localhost/phptuts/simple_error.php

Du vil få følgende resultater

PHP Feilhåndtering

Som du kan se fra resultatene ovenfor, får applikasjonen vår til å se uprofesjonell ut og kan være irriterende for brukeren.

Vi vil endre koden ovenfor og skrive en feilbehandler for applikasjonen

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

Forutsatt at du lagret koden ovenfor som error_handling.php, åpne URL-en http://localhost/phptuts/error_handling.php

PHP-unntakshåndtak i PHP

OBS: det er en god sikkerhetspraksis å vise en melding som den som er vist ovenfor i stedet for å vise meldingen som "File ikke funnet".

La oss se på et annet eksempel som bruker en tilpasset feilbehandler.

Den tilpassede feilbehandleren vil bli satt som standard PHP-feilhåndteringsfunksjon og vil i utgangspunktet vise et feilnummer og en melding.

Koden nedenfor illustrerer implementeringen av eksemplet ovenfor

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

Åpne URL-en http://localhost/phptuts/custom_error_handler.php vil du få følgende resultater

. PHP Feilhåndtering


Som du kan se fra eksemplet ovenfor, er tilpassede feilbehandlere kraftige i den forstand at

  • De lar oss tilpasse feilmeldingene.
  • Den tilpassede feilbehandleren kan også inkludere feillogging i en fil/database, e-post til utvikleren osv.

La oss nå se på den tredje typen feilhåndtering. Vi vil bruke den innebygde PHP-funksjonen error_reporting-funksjonen. Den har følgende grunnleggende syntaks

<?php
error_reporting($reporting_level);
?>

HER,

  • "error_reporting" er PHP-feilrapporteringsfunksjonen
  • "$reporting_level" er valgfritt, kan brukes til å angi rapporteringsnivå. Hvis det ikke er angitt noe rapporteringsnivå, vil PHP bruke standard feilrapporteringsnivå som spesifisert i php.ini-filen.
Rapporteringsnivå Tekniske beskrivelser Eksempel
E_ADVARSEL Viser kun advarselsmeldinger. Stopper ikke utførelsen av skriptet error_reporting(E_WARNING);
E_MERKNAD Viser merknader som kan oppstå under normal kjøring av et program eller som kan være en feil. error_reporting(E_ NOTICE);
E_USER_ERROR Viser brukergenererte feil, dvs. tilpasset feilbehandler error_reporting(E_ USER_ERROR);
E_USER_WARNING Viser brukergenererte advarselsmeldinger error_reporting(E_USER_WARNING);
E_USER_NOTICE Viser brukergenererte meldinger error_reporting(E_USER_NOTICE);
E_RECOVERABLE_ERROR Viser feil som ikke er dødelige og kan håndteres ved hjelp av tilpassede feilbehandlere error_reporting(E_RECOVERABLE_ERROR);
E_ALLE Viser alle feil og advarsler feilrapportering(E_ ALL);

Forskjellen mellom feil og unntak

  • Unntak er kastet og ment å bli fanget opp mens feil vanligvis er uopprettelige.
  • Unntak håndteres på en objektorientert måte. Dette betyr når et unntak blir kastet; det opprettes et unntaksobjekt som inneholder unntaksdetaljene.

Tabellen nedenfor viser metodene for unntaksobjekter

Metode Tekniske beskrivelser Eksempel
getMessage () Viser unntakets melding
<?php
echo $e->getMessage();
?>
getCode() Viser den numeriske koden som representerer unntaket
<?php
echo $e->getCode();
?>
getFile() Viser filnavnet og banen der unntaket skjedde
<?php
echo $e->getFile();
?>
getLine() Viser linjenummeret der unntaket skjedde
<?php
echo $e->getLine();
?>
getTrace() Viser en rekke av tilbakesporingen før unntaket
<?php
print_r( $e->getTrace());
?>
getPrevious() Viser det forrige unntaket før det gjeldende
<?php
echo $e->getPrevious();
?>
getTraceAsString() Viser tilbakesporingen til unntaket som en streng i stedet for en matrise
<?php
echo $e->getTraceAsString();
?>
__toString() Viser hele unntaket som en streng
<?php
echo $e->__toString();
?>


Nedenfor er den grunnleggende syntaksen for å kaste et unntak.

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

HER,

  • "kast" er nøkkelordet som brukes for å kaste unntaket
  • "new Exception(...)" oppretter et unntaksobjekt og sender "Dette er et unntakseksempel"-streng som meldingsparameter.

Koden ovenfor gir følgende melding.

PHP-unntakshåndtak i PHP

Vi skal nå se på et eksempel som implementerer unntakene for kast og fangst.

Vi vil modifisere eksemplet ovenfor og inkludere prøv, kast og fang.

Den har følgende grunnleggende syntaks.

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

HER,

  • "prøve{...}" er kodeblokken som skal kjøres som potensielt kan føre til et unntak
  • "catch(Exception $e){...}" er kodeblokken som fanger det kastede unntaket og tilordner unntaksobjektet til variabelen $e.

Koden nedenfor viser det grunnleggende unntakseksemplet med try, throw og catch-unntaket implementert.

Programmet kaster bevisst et unntak som det deretter fanger opp.

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

Åpne URL-en http://localhost/phptuts/exception_handling.php Du vil få følgende resultater.

PHP-unntakshåndtak i PHP

Det er også mulig å lage flere unntak for én php try-setning avhengig av typen unntak som er kastet.

Se artikkelen om MySQL, PHP-datatilgang... for implementeringseksempler på flere unntak

Flere unntak

Flere unntak bruker multiple try catch-blokker for å håndtere de kastede unntakene. Flere unntak er nyttige når;

  • Du vil vise en tilpasset melding avhengig av unntaket
  • Du ønsker å utføre en unik operasjon avhengig av unntaket som ble kastet

Flytskjemaet nedenfor illustrerer hvordan flere unntak fungerer

Flere unntak

La oss se på et eksempel som bruker flere unntak.

Vi vil modifisere koden som deler et tall med den beståtte nevneren.

Vi forventer at to typer unntak forekommer;

  • Divisjon med null
  • Divisjon på et negativt tall

For enkelhets skyld vil vi kun vise unntakstypen i fangstblokkene våre.

PHP innebygd i Exception-klassen brukes til å kaste unntak.

Vi vil lage to klasser som utvider unntaksklassen og bruke dem til å kaste unntak.

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

Tester koden

Vi vil anta at du har lagret multiple_exceptions.php i phptuts-mappen.

Bla til URL-en http://localhost/phptuts/multiple_exceptions.php

PHP-unntakshåndtak i PHP

Bytt tilbake til PHP-filen og pass -1 som parameter som vist i følgende diagram.

PHP-unntakshåndtak i PHP

Bla til URL-en http://localhost/phptuts/multiple_exceptions.php.

Hvilke resultater får du? Pass 3 som parameter.

Hvilke resultater får du?

Sammendrag

  • Feil er uventede resultater produsert av PHP-kode
  • Feilhåndtering forbedrer applikasjonsytelsen
  • PHP har innebygde funksjoner som kan brukes til å tilpasse måten PHP rapporterer feil på
  • Unntak er som feil, men de kan fanges opp ved hjelp av catch-blokken når de kastes.
  • Å vise feilmeldinger som viser feilinformasjon anses som en dårlig sikkerhetspraksis.

Oppsummer dette innlegget med: