Příklad PHP Try Catch: Výukový program pro zpracování výjimek a chyb

Co je to výjimka?

Chyba je neočekávaný výsledek programu, který nemůže zpracovat samotný program.

Chyby jsou vyřešeny opravou programu. Příkladem chyby může být nekonečná smyčka, která se nikdy nepřestane vykonávat.

Výjimkou je neočekávaný výsledek programu, který zvládne program sám.

Mezi příklady výjimek patří pokus o otevření souboru, který neexistuje.

Tuto výjimku lze vyřešit vytvořením souboru nebo poskytnutím možnosti uživateli soubor vyhledat.

Proč řešit výjimku?

  • Vyhněte se neočekávaným výsledkům na našich stránkách, které mohou být pro naše koncové uživatele velmi nepříjemné nebo dráždivé
  • Zlepšete zabezpečení našich aplikací tím, že nebudeme odhalovat informace, které mohou uživatelé se zlými úmysly použít k útoku na naše aplikace
  • Výjimky Php se používají ke změně normálního toku programu, pokud dojde k jakékoli předvídatelné chybě.

Zpracování chyb PHP

Když dojde k chybě, v závislosti na nastavení konfigurace PHP zobrazí chybovou zprávu ve webovém prohlížeči s informacemi týkajícími se chyby, ke které došlo.

PHP nabízí řadu způsobů, jak ošetřit chyby.

Podíváme se na tři (3) běžně používané metody;

  1. Zemřít prohlášení– funkce matrice kombinuje funkci echo a exit v jednom. Je to velmi užitečné, když chceme vypsat zprávu a zastavit provádění skriptu, když dojde k chybě.
  2. Vlastní obslužné rutiny chyb – jedná se o uživatelem definované funkce, které jsou volány vždy, když dojde k chybě.
  3. Hlášení chyb PHP – chybová zpráva v závislosti na nastavení hlášení chyb PHP. Tato metoda je velmi užitečná ve vývojovém prostředí, když nemáte ponětí, co způsobilo chybu. Zobrazené informace vám mohou pomoci při ladění vaší aplikace.

Chyba při zpracování příkladů

Podívejme se nyní na několik jednoduchých příkladů s rutinami pro zpracování chyb.

Předpokládejme, že jsme vyvinuli aplikaci, která používá k ukládání dat textové soubory. Možná budeme chtít zkontrolovat existenci souboru, než se z něj pokusíme číst data.

Níže uvedený kód implementuje výše uvedený příklad.

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

Za předpokladu, že jste uložili soubor simple_error.php do složky phptuts, otevřete URL http://localhost/phptuts/simple_error.php

Získáte následující výsledky

Zpracování chyb PHP

Jak můžete vidět z výše uvedených výsledků, naše aplikace vypadá neprofesionálně a může být pro uživatele obtěžující.

Výše uvedený kód upravíme a pro aplikaci napíšeme obsluhu chyb

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

Za předpokladu, že jste výše uvedený kód uložili jako error_handling.php, otevřete adresu URL http://localhost/phptuts/error_handling.php

PHP popisovač výjimek v PHP

Poznámka: je dobrým bezpečnostním postupem zobrazit zprávu jako výše uvedenou namísto zprávy jako „Soubor nenalezen“.

Podívejme se na další příklad, který používá vlastní obslužnou rutinu chyb.

Vlastní obslužný program chyb bude nastaven jako výchozí funkce zpracování chyb PHP a v podstatě zobrazí číslo chyby a zprávu.

Níže uvedený kód ilustruje implementaci výše uvedeného příkladu

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

Otevřete adresu URL http://localhost/phptuts/custom_error_handler.php získáte následující výsledky

. Zpracování chyb PHP


Jak můžete vidět z výše uvedeného příkladu, vlastní obslužné rutiny chyb jsou výkonné v tom smyslu

  • Umožňují nám přizpůsobit chybové zprávy.
  • Vlastní obsluha chyb může také zahrnovat protokolování chyb do souboru/databáze, zasílání e-mailů vývojáři atd.

Podívejme se nyní na třetí typ zpracování chyb. Budeme používat PHP zabudovanou funkci error_reporting. Má následující základní syntaxi

<?php
error_reporting($reporting_level);
?>

TADY,

  • „error_reporting“ je funkce hlášení chyb PHP
  • „$reporting_level“ je volitelný a lze ho použít k nastavení úrovně hlášení. Pokud nebyla zadána žádná úroveň hlášení, PHP použije výchozí úroveň hlášení chyb, jak je uvedeno v souboru php.ini.
Úroveň hlášení Description Příklad
E_VAROVÁNÍ Zobrazuje pouze varovné zprávy. Nezastaví provádění skriptu error_reporting(E_WARNING);
E_NOTICE Zobrazuje upozornění, která se mohou objevit během normálního provádění programu nebo mohou být chybou. error_reporting(E_ NOTICE);
E_USER_ERROR Zobrazuje chyby generované uživateli, např. vlastní obslužný program chyb error_reporting(E_ USER_ERROR);
E_USER_WARNING Zobrazuje uživatelem generované varovné zprávy error_reporting(E_USER_WARNING);
E_USER_NOTICE Zobrazuje upozornění generovaná uživateli error_reporting(E_USER_NOTICE);
E_RECOVERABLE_ERROR Zobrazí chybu, která není závažná a lze ji zpracovat pomocí vlastních obslužných rutin chyb error_reporting(E_RECOVERABLE_ERROR);
E_ALL Zobrazí všechny chyby a varování error_reporting(E_ ALL);

Rozdíl mezi chybami a výjimkami

  • Výjimky jsou vyvolány a jsou určeny k zachycení, zatímco chyby jsou obecně neodstranitelné.
  • Výjimky jsou zpracovávány objektově orientovaným způsobem. To znamená, když je vyvolána výjimka; je vytvořen objekt výjimky, který obsahuje podrobnosti o výjimce.

Níže uvedená tabulka ukazuje metody objektu výjimky

Metoda Description Příklad
getMessage() Zobrazí zprávu výjimky
<?php
echo $e->getMessage();
?>
získat kód() Zobrazuje číselný kód, který představuje výjimku
<?php
echo $e->getCode();
?>
getFile() Zobrazuje název souboru a cestu, kde došlo k výjimce
<?php
echo $e->getFile();
?>
getLine() Zobrazuje číslo řádku, kde došlo k výjimce
<?php
echo $e->getLine();
?>
getTrace() Zobrazí pole zpětného sledování před výjimkou
<?php
print_r( $e->getTrace());
?>
getPrevious() Zobrazí předchozí výjimku před aktuální
<?php
echo $e->getPrevious();
?>
getTraceAsString() Zobrazí backtrace výjimky jako řetězec namísto pole
<?php
echo $e->getTraceAsString();
?>
__toString() Zobrazí celou výjimku jako řetězec
<?php
echo $e->__toString();
?>


Níže je uvedena základní syntaxe pro vyvolání výjimky.

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

TADY,

  • „throw“ je klíčové slovo používané k vyvolání výjimky
  • „new Exception(…)“ vytvoří objekt výjimky a předá řetězec „Toto je příklad výjimky“ jako parametr zprávy.

Výše uvedený kód zobrazí následující zprávu.

PHP popisovač výjimek v PHP

Nyní se podíváme na příklad, který implementuje výjimky throw a catch.

Výše uvedený příklad upravíme a zahrneme do něj pokusy, házení a chycení.

Má následující základní syntaxi.

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

TADY,

  • „try{…}“ je blok kódu, který se má provést a který by mohl potenciálně vyvolat výjimku
  • “catch(Exception $e){…}” je blok kódu, který zachytí vyvolanou výjimku a přiřadí objekt výjimky proměnné $e.

Níže uvedený kód ukazuje příklad základní výjimky s implementovanou výjimkou try, throw a catch.

Program schválně vyvolá výjimku, kterou pak zachytí.

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

Otevřete adresu URL http://localhost/phptuts/exception_handling.php Získáte následující výsledky.

PHP popisovač výjimek v PHP

Je také možné vytvořit více výjimek pro jeden příkaz php try v závislosti na typu vyvolané výjimky.

Viz článek na MySQL, PHP data access… pro příklady implementace více výjimek

Více výjimek

Vícenásobná výjimka používá více bloků try catch ke zpracování vyvolaných výjimek. Vícenásobné výjimky jsou užitečné, když;

  • Chcete zobrazit přizpůsobenou zprávu v závislosti na vyvolané výjimce
  • Chcete provést jedinečnou operaci v závislosti na vyvolané výjimce

Níže uvedený vývojový diagram ukazuje, jak funguje více výjimek

Více výjimek

Podívejme se na příklad, který používá více výjimek.

Upravíme kód, který dělí číslo zadaným jmenovatelem.

Očekáváme výskyt dvou typů výjimek;

  • Dělení nulou
  • Dělení záporným číslem

Pro jednoduchost budeme v našich catch blocích zobrazovat pouze typ výjimky.

PHP vestavěná třída Exception se používá k vyvolání výjimek.

Vytvoříme dvě třídy, které rozšíří třídu výjimek a použijí je k vyvolání výjimek.

Níže uvedený kód ukazuje implementaci.

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

Testování kódu

Budeme předpokládat, že jste uložili multiple_exceptions.php do složky phptuts.

Přejděte na adresu URL http://localhost/phptuts/multiple_exceptions.php

PHP popisovač výjimek v PHP

Přepněte zpět do souboru PHP a předejte -1 jako parametr, jak je znázorněno na následujícím diagramu.

PHP popisovač výjimek v PHP

Přejděte na adresu URL http://localhost/phptuts/multiple_exceptions.php.

Jaké výsledky získáváte? Předejte 3 jako parametr.

Jaké výsledky získáváte?

Shrnutí

  • Chyby jsou neočekávané výsledky vytvořené kódem PHP
  • Zpracování chyb zlepšuje výkon aplikace
  • PHP má vestavěné funkce, které lze použít k přizpůsobení způsobu, jakým PHP hlásí chyby
  • Výjimky jsou jako chyby, ale mohou být zachyceny pomocí bloku catch při hození.
  • Zobrazování chybových zpráv, které zobrazují informace o chybě, je považováno za špatný postup zabezpečení.