Hlavní navigace

PHP okénko: Kontrola chyb

Jakub Vrána

Zásadou správného programování je předem ošetřovat případné chyby. Dnešní PHP okénko popisuje různé způsoby ošetření chyb a rozebírá jejich vhodnost v různých situacích.

Dobrou zásadou při programování je ošetřovat případně vzniklé chyby. Naopak špatnou zásadou pro tvorbu elegantního kódu je dělat to za všech okolností přímo v kódu, protože tím dochází k jeho zamořování nepřehledným balastem.

<?php
// bez kontroly chyb
$result = mysql_query("SELECT * FROM tabulka");

// kontrola chyb přímo v kódu - nepřehledné
$result = mysql_query("SELECT * FROM tabulka");
if (!$result) {
    echo "<p>Chyba v SQL dotazu!</p>\n";
}

// ošetření je skryto v k tomu určené funkci
$result = mysql_q("SELECT * FROM tabulka");
?> 

Druhý způsob je z mého pohledu vyloženě špatně, protože nosná myšlenka kódu je skryta mezi spoustou kódu pro ošetření chyb. Třetí způsob dotažený do důsledku podle mě také není ideální, protože místo standardních funkcí se všude používají funkce vlastní, což cizímu programátorovi znesnadňuje čtení a případné vytváření kompatibilního kódu. V tomto konkrétním případě mi přijde nejlepší povolit standardní direktivu mysql.trace_mode a používat první způsob. Chyby v SQL dotazech se pak budou zpracovávat stejně jako ostatní PHP chyby.

V některých případech se dá bez kontroly chyb zcela obejít (např. když se nepodaří uložit informaci o shlédnutí stránky, tak tím návštěvníka určitě nebudeme obtěžovat), na kritických místech je ale správná kontrola chyb velice důležitá:

<?php
// špatný kód
mail("info@example.com", "Test", $_POST["zprava"]);
echo "<p>Děkujeme za odeslání zprávy.</p>\n";

// s ošetřením chyb
if (mail("info@example.com", "Test", $_POST["zprava"])) {
    echo "<p>Děkujeme za odeslání zprávy.</p>\n";
} else {
    echo "<p>Zprávu se nepodařilo odeslat, kontaktujte nás prosím <a href='mailto:info@example.com'>e-mailem</a>.</p>\n";
}
?> 

Opět by samozřejmě bylo možné chybu ošetřit ve funkci za tím účelem vytvořené, pokud se ale ošetření kritické chyby liší podle kontextu, je asi nejlepší ho přeci jen dát přímo do kódu.

PHP 5 nabízí podobně jako řada dalších jazyků mechanismus výjimek. Ale vzhledem k tomu, že interní funkce PHP výjimky nepoužívají, nemusí být jejich volba tím nejlepším možným řešením, protože následně je nutné odděleně ošetřovat výjimky a standardní PHP chyby.

Málo věcí je trapnějších než zobrazování standardních chybových hlášek PHP typu Parse error: syntax error, unexpected … in … on line … přímo v prezentaci. Ve správně napsané aplikaci by k takovýmto chybám docházet vůbec nemělo, ale i tak je jistější zobrazování těchto chyb na produkčních serverech zakázat direktivou display_errors. I v aplikaci bez chyb totiž může dojít k zobrazení chybových hlášek při změně verze PHP nebo konfigurace. Spolu s vypnutím zobrazování chyb je vhodné zapnout direktivu error_log a vzniklý log čas od času (nebo pravidelně např. skriptem posílajícím mail) kontrolovat. To se ostatně hodí i při vývoji, protože chybové hlášky zobrazované přímo v prezentaci je možné za určitých okolností přehlédnout.


Podobně laděné texty můžete najít i na autorově weblogu PHP triky.

Našli jste v článku chybu?

25. 4. 2005 12:40

Jan Tichý (neregistrovaný)
To je zase jeden clanek o nicem...

Jinak s tim vyhazovanim Exceptions u normalnich PHP funkci, neni zase az takovy problem nadefinovat si jednoduse vlastni error handler (http://cz.php.net/manual/en/function.set-error-handler.php), ktery tu vyjimku pri normalni chybe vyvola...

3. 9. 2010 0:02

Čecháček (neregistrovaný)

Myslel, jsem že je to dílo amatéra. Článek je utnutý v půlce a nic neříká. Nejsem sám.

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Vitalia.cz: Vychytané vály a válečky na vánoční cukroví

Vychytané vály a válečky na vánoční cukroví

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

Měšec.cz: mBank cenzuruje, zrušila mFórum

mBank cenzuruje, zrušila mFórum

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Podnikatel.cz: Snížení DPH na 15 % se netýká všech

Snížení DPH na 15 % se netýká všech

Měšec.cz: Stavební spoření: alternativa i pro seniory

Stavební spoření: alternativa i pro seniory

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách