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, Díl, Fatální chyba, Head, Chyba, Echo, Meta, Určitá situace, HTML, Třetí kategorie


Určitě si přečtěte

Google mapy, Seznam mapy, Apple mapy... Velké srovnání šesti internetových map. Kdo to dělá nejlépe?

Google mapy, Seznam mapy, Apple mapy... Velké srovnání šesti internetových map. Kdo to dělá nejlépe?

** Která klasická webová mapa se vám líbí nejvíce? ** Srovnali jsme šest velkých služeb v několika situacích ** Hlasujte v anketě

Jakub Čížek | 78

Je lepší hrát na PC, či na konzolích? Nebo jsou i jiné možnosti?

Je lepší hrát na PC, či na konzolích? Nebo jsou i jiné možnosti?

** Jaké jsou výhody a nevýhody hraní na počítači? ** Co mají společného a v čem se liší Xbox One, PS4 a Switch? ** Na čem hrát, když nemáte výkonné PC ani konzoli?

Lukáš Václavík | 125

Jak se žije s telefonem bez Googlu: Čerstvé zkušenosti s telefony Honor a Huawei

Jak se žije s telefonem bez Googlu: Čerstvé zkušenosti s telefony Honor a Huawei

** Honor u nás přichází s prvním telefonem bez Google Mobile Services ** Současný stav je lepší než na začátku, ideální ale není ** Zkusili jsme i hack s ručním přidáním služeb Googlu

Tomáš Holčík | 162

Podívejte se, co dokáže vyrobit jedna z nejexotičtějších 3D tiskáren v Česku

Podívejte se, co dokáže vyrobit jedna z nejexotičtějších 3D tiskáren v Česku

** Na jaře tiskla unikátní české respirátory ** Používá ji třeba Škoda Auto, a.s. ** Zajeli jsme se podívat do pražského showroomu 3Dees

Jakub Čížek | 12

Epic chce rozbít monopol Play Storu a App Storu. Nastražil trik s hrou Fortnite a žaluje Google i Apple

Epic chce rozbít monopol Play Storu a App Storu. Nastražil trik s hrou Fortnite a žaluje Google i Apple

** Apple a Google odstranili z obchodů s aplikacemi hru Fortnite ** Její vývojáři nejprve přichystali parodické video ** V žalobách viní obě firmy z monopolního chování

Karel Kilián | 134


Aktuální číslo časopisu Computer

Megatest mobilů do 8 000 Kč

Test bezdrátových headsetů

Linux i pro začátečníky

Jak surfovat anonymně