Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

PHP okénko: Kontrola chyb

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.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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.

TIB2012

       

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.

Jakub Vrána

Jakub Vrána

Autor se živí programováním v PHP, podílí se na jeho oficiální dokumentaci, vyučuje ho na MFF UK a vede odborná školení. Poznámky si zapisuje na weblog PHP triky.

Školení: TCP/IP na Linuxu I.

V tomto kurzu se seznámíte se síťováním v Linuxu na všech vrstvách. Ujasníte si možnosti použití Linuxu v roli klienta, serveru i routeru.

  • Počítačové sítě
  • Architektura TCP/IP
  • Ethernet
  • Protokol PPP
  • Protokoly IPv4 a IPv6
  • IP na ethernetu
  • IP routing
  • Chybové a řídící zprávy
  • Transportní protokoly
  • Překlady jmen a adres
  • Aplikace
  • Překlady síťových adres a proxying
  • Testování sítě
  • Aktuální situace na poli TCP/IP

Podrobnější informace a přihláška  

Ohodnoťte jako ve škole:
Průměrná známka 3,57

Přehled názorů

A co takhle?
PD. 25. 4. 2005 08:29
Nový
Nebo taky
Lukoko 25. 4. 2005 10:20
Nový
└ 
Re: Nebo taky se hlupak :-(
Lukoko 25. 4. 2005 10:25
Nový
 
└ 
Bezpečejší způsob >>> Re: Nebo taky se hlupak :-(
Vít Peprníček 25. 4. 2005 13:35
Nový
???
Pachollini 25. 4. 2005 10:45
Nový
to je vtip?
jirka 25. 4. 2005 11:07
Nový
Vyjimky a runtime chyby
Jan Tichý 25. 4. 2005 12:40
Nový
Opravdu o nicem
Michaels 25. 4. 2005 13:02
Nový
└ 
Re: Opravdu o nicem
martin 25. 4. 2005 15:21
Nový
Já radši takhle...
Mordae 25. 4. 2005 15:48
Nový
or
efesak 25. 4. 2005 16:13
Nový
or
efesak 25. 4. 2005 16:14
Nový
Ach jo
cpt_nemo 25. 4. 2005 16:32
Nový
└ 
Re: Ach jo
Jakub Vrána 26. 4. 2005 10:49
Nový
tak tedy aspoň něco
mintaka 25. 4. 2005 23:44
Nový
Nejasný článek
Jakub Vrána 26. 4. 2005 07:46
Nový
└ 
Re: Nejasný článek
Martin Mayer 26. 4. 2005 11:12
Nový
A co třeba jazyková korektura ?!?
Frn 26. 4. 2005 08:58
Nový
Jinak
MaReK Olšavský 26. 4. 2005 12:07
Nový
tak
debian 27. 4. 2005 07:24
Nový
Lepsi reseni
Kamzik II 12. 7. 2005 13:08
Nový
Tohle psal vrána?
Čecháček 3. 9. 2010 00:02
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem