PHP - 23. díl – chyby a ošetřování chyb

Tento díl se bude zabývat často opomíjeným tématem v PHP, a to chybami. Povíme si, jak vznikají, jak se dají ošetřit, a vůbec, co všechno nám PHP v souvislosti s chybami dovoluje.

Kategorie chyb v PHP

Samotný systém PHP rozděluje chyby do několika kategorií, zjednodušeně se dá říci, že podle závažnosti chyby a podle zdroje chyby:

Kategorie chyby Popis Číslo chyby
E_ERROR Fatální chyba, skript je po výskytu takové chyby předčasně ukončen. 1
E_WARNING Varovná chyba. 2
E_PARSE Chyba při kompilaci skriptu. 4
E_NOTICE Poznámka, která může znamenat nějaké opomenutí, nebo chybu. 8
E_CORE_ERROR Fatální chyba generovaná jádrem PHP. 16
E_CORE_WARNING Varovná chyba generovaná jádrem PHP. 32
E_COMPILE_ERROR Fatální chyba vzniklá při kompilaci skriptu. 64
E_COMPILE_WARNING Varovná chyba vzniklá při kompilaci skriptu. 128
E_USER_ERROR Uživatelem generovaná chyba. 256
E_USER_WARNING Uživatelem generované varování. 512
E_USER_NOTICE Uživatelem generovaná poznámka. 1024

Některé kategorie chyb je možné do jisté míry kontrolovat. Je možné ošetřovat chyby, které vzniknout za běhu skriptu. Naopak s chybami, které vzniknou například jako důsledek syntaktické chyby ve skriptu moc nenaděláme.

Konfigurace v php.ini

V konfiguračním souboru php.ini jsou dva důležité parametry, které ovlivňují výpisy chyb. Pokud totiž nastane chyba, obvykle nastane výpis chyby na obrazovku. Tento výpis chyby můžeme řídit pomocí parametrů error_reporting a display_errors. Parametr error_reporting nastavuje, které kategorie chyb se budou hlásit na obrazovku. Obvyklé je hlášení všech kategorií chyb s výjimkou E_NOTICE. Parametr display_errors nastavuje, zda se vůbec budou chyby vypisovat jako součást výstupu, nebo ne. Obvykle je nastaveno, že se chyby vypisují.

Příklady chyb

Aby to celé bylo jasnější, uvedu zde několik příkladů generování chyby. Zde je syntaktická chyba ve skriptu (chybí středník na konci prvního příkazu):

<?php
  $a = 1 + 1
  $b = $a + 1;
?>

Pokud si zkusíte výše uvedený PHP skript spustit, skončí to výpisem chyby kategorie E_PARSE. Tato chyba označuje chybu v zápisu skriptu.

Příklad chyby za běhu skriptu lze také vytvořit snadno, například takto (v našem příkladě dělení nulou):

<html>
<head>
<title>Příklad 2. z 23. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $a = 0;
  echo `Před dělením nulou<br>`;
  $b = 3 / $a;
  echo `Po dělení nulou<br>`;
?>
</body>
</html>

Pokud si příklad vyzkoušíte, zjistíte, že PHP vám do něj vypíše anglickou zprávu o tom, že jste dělili nulou. Protože však jde o pouhé varování, tedy kategorii E_WARNING, nepovažuje to za důvod pro ukončení skriptu, který běží dále až do samého konce.

Obyčejnou, ale často přehlíženou chybou je i použití neexistující proměnné. Většina PHP systémů je totiž nastavena tak, že tuto chybu nijak neoznámí:

<?php
  $b = $a + 1;
  echo $b;
?>

Ve výše uvedeném příkladu používám proměnnou $a, která ale není předtím nikde vytvořena. PHP skript potom vygeneruje chybu kategorie E_NOTICE, tedy nejméně závažnou chybu. Většina PHP systémů takovou chybu nevypíše, ale pokud používáte intranetový server z 2. dílu na testování, chybovou zprávu dostanete.

Při použití neexistující proměnné v našem příkladu se PHP skript zachová tak, jako kdyby neexistující proměnná měla nulovou hodnotu. Následující příkaz echo proto vypíše jedničku.

Operátor řízení chyb - @

V PHP existuje operátor řízení chyb, který blokuje výpis chybových zpráv. Je to znak zavináč @, který můžete předřadit před jakýkoli výraz, kde získáváte hodnotu. V tomto výrazu pak jsou blokovány jakékoli, i kritické chybové zprávy.

Například takto zablokujeme chybovou zprávu o dělení nulou:

<html>
<head>
<title>Příklad 4. z 23. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  $a = 0;
  echo `Před dělením nulou<br>`;
  $b = @(3 / $a);
  echo `Po dělení nulou<br>`;
?>
</body>
</html>

Jak je vidět, samotný výraz, kde se dělilo nulou jsem uzavřel do závorky, kterým jsem předřadil znak zavináč @. Ten zajistí, že žádná chybová zpráva o dělení nulou, ani žádná jiná, která by na tomto místě vznikla, nebude vypsána.

Stejně jednoduše je možné zablokovat chybové zprávy v jakémkoli dalším příkladě, například i zprávu o případné neexistující proměnné:

<?php
  $b = @$a + 1;
  echo $b;
?>

Blokování chyb pomocí znaku zavináče @ pracuje jen v případě chyb za běhu. Nelze se takto zbavovat chybových hlášení tam, kde je špatná syntaxe, apod..

Každopádně používejte operátor řízení chyb, tedy znak zavináč @ jenom v co nejmenší možné míře. Mohli byste tak přijít o zobrazení závažné chyby, kterou byste potom dlouho hledali.

Generování vlastních chyb

Někdy se hodí vygenerovat vlastní chybu. Hodí se to v situaci, kdy pro náš případ znamená určitá situace chybu, i když pro PHP je tato situace naprosto v pořádku. Generovat se dají tři kategorie chyb, a to chyba E_USER_ERROR, E_USER_WARNING a E_USER_NOTICE. První z nich je nejzávažnější a předčasně ukončuje běh skriptu, druhá je méně závažná a třetí je nejméně závažná. Druhá a třetí kategorie dovoluje PHP skriptu pokračovat v běhu.

Pro generování vlastních chyb slouží funkce trigger_error:

<html>
<head>
<title>Příklad 6. z 23. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
  trigger_error(`Moje vlastní chyba`, E_USER_ERROR);
?>
</body>
</html>

Výše uvedený příklad vypíše vlastní chybu "Moje vlastní chyba".

Funkce trigger_error má dva parametry:

trigger_error (chybová_zpráva, kategorie_chyby)

Vlastní ošetřování chyb

Pro určité případy se nám může hodit vlastní ošetření chyb namísto standardního vypsání na obrazovku. PHP umožňuje zařídit právě to, aby se chyby automaticky posílaly námi napsané funkci namísto standardního zpracování chyb.

Zde je jednoduchý příklad, jak výpisy chyb počeštit pomocí vlastního ošetření chyb:

<html>
<head>
<title>Příklad 7. z 23. dílu</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php

function MojeZpracovaniChyby ($cislo, $zprava, $soubor, $radka)
{
  echo "Chyba číslo $cislo: $zprava na řádku $radka v souboru $soubor.<br>";
}

set_error_handler(`MojeZpracovaniChyby`);

trigger_error(`Moje vlastní chyba`, E_USER_ERROR);

?>
</body>
</html>

V příkladu je vidět, jak se dělá vlastní obsluha chyb. Připravil jsem si vlastní funkci, která bude ošetřovat chyby, a kterou jsem nazval MojeZpracovaniChyby. Důležité je, že funkce má nejobvykleji čtyři parametry, a to postupně číslo chyby, chybovou zprávu, název souboru a číslo řádku, kde nastala chyba.

Pak název funkce, která bude ošetřovat chyby předám do set_error_handler a od této chvíle se bude PHP při chybě obracet na mojí funkci, kdykoli nějaká chyba nastane.

Diskuze (2) Další článek: Nový červ Atak se maskuje „uspáváním“ špiónů

Témata článku: Software, Windows, Programování, PHP, Třetí kategorie, Echo, Meta, Chyba, Určitá situace, HTML, Fatální chyba, Head, Díl, Software na Heureka.cz



Sex manželských párů? Jen výjimečně. Ložnice ovládnou roboti s umělou inteligencí

Sex manželských párů? Jen výjimečně. Ložnice ovládnou roboti s umělou inteligencí

** Sex manželských párů jen při zvláštních příležitostech. ** Ložnice ovládnou sexuální roboti s umělou inteligencí. ** I to je jeden ze závěrů Mezinárodní robotické konference.

Filip KůželJiří Liebreich
RobotiSexUmělá inteligence
Druhotné softwarové licence. Kdo by nechtěl legální Windows za stovku…

Druhotné softwarové licence. Kdo by nechtěl legální Windows za stovku…

Koupě originálního programového vybavení přímo od výrobce není jedinou možností, jak sehnat pro váš počítač legální software. Další možností je koupit licenci od toho, kdo ji už nepotřebuje nebo nevyužije. Můžete ušetřit nemalou částku, zároveň si však dávejte pozor na podvodníky.

Jan Spěšný
Nový hit. Tahle appka vám udělá profilovku jako od pouličního ilustrátora

Nový hit. Tahle appka vám udělá profilovku jako od pouličního ilustrátora

** Aplikace NewProfilePic se na Androidu stala hitem ** Můžete si v ní vytvořit profesionálně vypadající profilovky ** Pozor ale na agresivní cenovou politiku za Pro verzi

Martin Chroust
FotografieUmělá inteligenceMobilní aplikace
Nejlepší příběhové hry pro PC a konzole. Vede Zaklínač, tajuplný NieR a divoký západ v Red Dead

Nejlepší příběhové hry pro PC a konzole. Vede Zaklínač, tajuplný NieR a divoký západ v Red Dead

Občas se nechcete socializovat. Občas chcete jen sednout a vychutnat si parádní příběh. A na to jsou nejlepší singleplayerové zážitky. Máme pro vás ty nejlákavější!

Martin Nahodil
Nejlepší hry
25 nejlepších filmových parodií, které můžete vidět. Víme, kde je najdete online

25 nejlepších filmových parodií, které můžete vidět. Víme, kde je najdete online

Filmové parodie jsou divácky velmi vděčné a mezi filmaři oblíbené. Tvůrci v nich mohou totiž zcela beztrestně vykrádat cizí díla a v jejich nápodobě popustit uzdu své fantazii. Vybrali jsme nejlepší zahraniční i české parodie.

Marek Čech
Filmy, které musíte vidět
Jak zrcadlit obrazovku mobilu a počítače do televize

Jak zrcadlit obrazovku mobilu a počítače do televize

Ať už se chcete pochlubit fotkami z dovolené na velké obrazovce, nebo si přehrát video uložené na disku počítače, neobejdete se bez zrcadlení obrazovky. Ve výchozím stavu jej podporuje Windows i Android.

Stanislav Janů
NávodyTelevizeWindows
Ruský notebook je přesně tak hrozný, jak si představujete

Ruský notebook je přesně tak hrozný, jak si představujete

** Letos se začne prodávat první ruský notebook Bitblaze Titan ** Neohromí výkonem ani výbavou, nýbrž svou neotesaností ** A stejně nakonec není tak ruský, jak se tváří

Lukáš Václavík
RuskoNotebooky