• PHP Deel 14: Foutafhandeling

    19 July 2011 23:37 door
    Tijdens de uitvoering van een stuk PHP code kunnen er exceptions optreden (deling door nul, bestand niet gevonden, ...). We willen de gebruiker hier niet mee lastig vallen dus we moeten deze exceptions opvangen en afhandelen.



    14.1 Exception throwen en catchen (try-catch)

    Exceptions afhandelen werkt in PHP net zoals in andere talen met een try catch blok:
    PHP-code:
    <?php
        
    function deel($a$b)
        {
            if (
    $b == 0)
                throw new 
    Exception('Deling door nul');
            else
                return 
    $a $b;
        }

        try
        {
            echo 
    deel(50);
        }
        catch (
    Exception $e)
        {
            echo 
    $e->getMessage();
        }
    ?>
    We kunnen de exceptions in het catch blok afhandelen (zie voorbeeld) of verder doorgeven met: throw $e;

    Het is beter de oude exception verder te throwen dan en een nieuwe exception te maken, de stacktrace gaat dan verloren en maakt het debuggen een stuk moeilijker.

    In PHP kunnen we ook fouten onderdrukken door er een @ voor te plaatsen, deze method is error-supression en niet error-handling! De fout dient nog altijd afgehandeld te worden op een andere plaats! (voorbeeld bij Databases)

    14.2 Exceptions definieren

    In PHP kan je je eigen exceptions definieren, dit doe je door een klasse aan te maken en de klasse Exception te extenden.
    PHP-code:
    <?php
        
    class mijnException extends Exception
        
    {
            public function 
    __construct($bericht$code 0)
            {
                
    parent::__construct($bericht$code);
            }

            public function 
    doeIets() 
            { 
                
    //hier kan je iets extra doen
            
    }
        }
    ?>
    We kunnen deze exception nu ook thowen:
    PHP-code:
    <?php
    throw new mijnException(‘Deling door nul’10);
    ?>
    14.3 Catch all

    Met de set_exception_handler() functie kunnen we in PHP een catch-all functie opgeven die aangeroepen word iedere keer er een exception optreedt die niet opgevangen wordt. Je kan deze functie gebruiken om de exception nog op te vangen, de fout herstellen gaat niet meer. De exception is nog steeds fatal en alle code na de exception(handler) wordt niet meer uitgevoerd.
    PHP-code:
    <?php
        
    function handleAllException($e)
        {
            echo 
    $e->getMessage();
        }

        
    set_exception_handler("handleAllException");

        throw new 
    exception('Dit wordt nog wel afgedrukt');

        echo 
    'Dit wordt nooit afgedrukt';
    ?>
    Met restore_exception_handler() kunnen we de orginele handler terug herstellen.
    Er is ook een set_error_handler() beschikbaar voor PHP errors.

    Meer info: Extending Exceptions

    Geschreven door: Martijn Croonen.
    Kleine aanpassingen door: Aerts Kurt.