ugrás a tartalomhoz

hibakezelés

szabo.b.gabor · 2008. Szep. 23. (K), 07.28
Kérdésem az volna, hogy ki milyen függvényeket, megoldásokat használ és mire?

set_error_handler()
saját hibaüzenetkezelés, logolás..

trigger_error()
hiba létrehozása (akár logolásra..)

set_exception_handler()
a nem elkapott kivételek kezelésére. ez mondjuk mire jó? bizonyos exception-öknél visszacsinálok dolgokat (pl db, rollback), vagy kezeletlen hibáknál vmi egységes hibaüzenet. de ugye jól érzem, hogy amikor ezt használjuk, akkor a program futása megszakad?

try{

}catch{

}

ha a try-ban valami hiba van, catch-ben hatástalanítom / megcsinálom másképp (pl. db insert-et akartam, de duplicate entry lett volna, így update-et csinálok), aztán mehet tovább a program futása, vagy akár ki is léphetek..

register_shutdown_function()
érdekes felhasználást láttam itt a hozzászólások között. biztosan jó másra is.

egyéb lehetőségek? hasznos felhasználási módok? tippek trükkök? ilyesmik (:
 
1

Mindent exception-né

tolmi · 2008. Szep. 23. (K), 08.47
Én mondjuk mindent exception-né alakítok (pl. a set_error_handlerrel beállított error handler is minden esetben exception-t dob) és minél korábban try { } catch-be foglalom a kódomat (ha webalkalmazást készítek, akkor a legeslegelső utasítás a <?php után egy try). Ez a catch ág általában egy error action-nek delegálja a hívást, amely pofás kis üzenetet jelenít meg.

Ha az error action-ben hiba van, akkor a catch ágban már tudom hogy egy hibakezelés van folyamatban és nem route-olom a hibakezelő action-re a hívást, hanem egy egyszerű HTML hibaüzenetet printelek ki ott helyben (és nincs die vagy exit a végén, hiszen a catch blokk az utolsó, ami az index.php végén van):

try {
  ...
} catch (Exception $e) {
  static $errorHandlingInProgress = false;
  if (!$errorHandlingInProgress) {
    Front_Controller::route(array('Error', 'internalError'), array('exception' => $e));
  }
  else {
    $page = '<html><head><title>Internal Server Error</title></head><body><h1>501 - Internal Error Occured While Processing Your Request</h1>Please notify the maintainers of this website of this error you encoutered. We apologise for you inconvenience.</body></html>';
    header('HTTP/1.1 501 Internal Server Error', true);
    print $page;
  }
}
Persze van ob_start() és ob_end_flush() a kódban.

Egyetlen gondom ezzen [a nekem bevált] megoldással, hogy jó lenne logolni is az olyan eseteket, amikor az error handler pusztult el, azonban a loggolási logika ezt a failsafe mechanizmust elbonyolítaná és ezzel potenciális hibaforrásokat adna a dologhoz.
2

Ellenkezője

janoszen · 2008. Szep. 23. (K), 09.41
Én pont az ellenkezőjét csinálom, exceptionöket error-rá, de az 500-as hiba itt is stimmel. Több problémám volt az error-> exception fölállással. Meg nem mondom, mibe, de valami problémám volt.
3

call stack

vbence · 2008. Szep. 23. (K), 13.26
Szerintem ez esszenciális informáci egy hiba felderítésében, nem iszem, hogy pótolni lehetne.
4

Nálam a call stack

tolmi · 2008. Szep. 23. (K), 16.09
Nálam a call stack automatikusan megmarad, mert az error handler okosan belepasszírozza az Exception-be a debug_backtrace kimenetét is.

Persze nem tökéletes és kell hozzá saját Exception osztály, de nekem bevált.
7

én is

vbence · 2008. Szep. 24. (Sze), 10.01
... pont az excetionök mellett érveltem.
8

Oké

tolmi · 2008. Szep. 24. (Sze), 10.47
Nem igazán rákontrázás akart lenni, csak gondoltam jelzem hogy lehetőség van ám arra is hogy az error-ig tartó trace felülírja az exception saját trace-ét.
5

catch

tolmi · 2008. Szep. 23. (K), 16.19
Hát szived joga, én szeretném a kódomban a logikus helyen lekezelni a hibákat és ha valami töketlen függvényhívás error-t dob, akkor semmi esélyem máshol lekezelni, mint az error handlerben.

Egyetlen kiút ebből, ha az error handlert exception-né alakítja a hibát és eldobja azt. Így tudok csinálni például ilyet:

try {
  $db = mysql_connect($config['server-normal']);
} catch (Exception $e) {
  try {
    $db = mysql_connect($config['server-backup']);
  } catch (Exception $e2) {
    die('No luck today');
  }
}
6

http://weblabor.hu/blog/20080

Hodicska Gergely · 2008. Szep. 23. (K), 23.02
http://weblabor.hu/blog/20080710/phpautoloadbug#comment-54138
Belinkelnék egy hibakezelésről szóló doksit, amit még belső oktatási anyagnak csináltam. Szerettem volna belőle cikket, de mostanában úgyis esélytelen, ezért ez a téma kitűnő alkalom a megosztására.



Üdv,
Felhő