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?