Google+ Followers

donderdag 7 november 2013

Foutafhandeling.

Wanneer op je website iets gebeurt waardoor de gewone gang van zaken niet afgerond kan worden dan is er maar één manier om het correct af te handelen:

Toon een foutmelding die de bezoeker uitlegt wat er aan de hand is, en geef via header()  de HTTP statuscode 500  (interne server fout) of 503 (dienst tijdelijk niet beschikbaar).
De foutmelding is logisch; je bezoekers moeten weten dat er iets mis is, je kunt niet botweg een lege pagina laten zien. de HTTP statuscode voorkomt dat zoekmachines je foutmelding zien als nieuwe content, of erger; beslissen dat je hele website kaputt is en je ranking resetten.


Is het lastig om dit goed te doen? Helemaal niet.
PHP heeft exceptions. Je kunt in principe in je index.php een try{} block maken met een catch() die  de foutmelding en de HTTP code doorgeeft. Elke fout die in je scripts gebeurt hoeft alleen een exception te werpen om in de buitenste catch te komen en de melding+statuscode te laten verzenden.

Dat betekent dus ook dat die() en exit() alleen voorkomen in die buitenste catch(), en nergens anders. *NERGENS*.

<?php
ob_start();
try{
  // Doe hier al je werk
    if (!fopen(...))
    {
        // Er ging iets fout, werp een exception die door het buitenste catch block wordt opgevangen.
        throw new \Exception("Could not open file");
    }
    // Stuur alle geprinte data naar de browser.
    ob_flush();
}
catch (\Exception $e)
{
    // Gooi alle geprinte data weg zodat alleen de foutmelding naar de browser wordt gestuurd.
    ob_end_clean();
    header('HTTP/1.1 503 Service Temporarily Unavailable');
    header('Status: 503 Service Temporarily Unavailable');
    echo "Sorry, de site is tijdelijk niet beschikbaar.";
}
?>