Exceptions in PHP 5

Tot nu toe hebben we enkel eenvoudige voorbeelden van foutafhandeling in PHP bekeken. We hebben gezien hoe die() een script genadeloos om zeep helpt, hoe trigger_error() iets flexibeler is in het geven van een foutmelden en hoe we met set_error_handler() een eigen foutafhandeling functie kunnen gebruiken.

Met de komst van exceptions in PHP 5 hebben we een uiterst krachtige manier van foutafhandeling tot onze beschikking gekregen. Dit mechanisme biedt veel meer flexibiliteit, vooral bij het opvangen van fouten en het weergeven van gedetailleerde foutinformatie.

In de rest van deze tutorial zal ik het gebruik van exceptions in PHP behandelen. Ik zal beginnen met het gebruik van try-throw-catch combinaties om vervolgens verder te gaan met iets complexere voorbeelden zoals het gebruik van error types en het uitbreiden van de Exception klasse. Omdat het gebruik van exceptions berust op het principe van object georiƫnteerd programmereren, is het voor het vervolg van deze tutorial makkelijk als je daar enige kennis van hebt.

Werken met exceptions
Het eerste dat je in gedachten moet houden bij het werken met exceptions, is dat het geen vervanging is van de interne error handler van PHP. Zo worden alle parse errors en fatale fouten nog steeds als lelijke melding op het scherm gezet. Maar deze fouten zou je in principe alleen bij het debuggen tegenkomen en de eindgebruiker zou ze nooit zien. De fouten die de eindgebruiker ziet zijn namelijk degenen die jij met behulp van exceptions weergeeft.

Laten we kijken naar een eenvoudig voorbeeldje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

function
groter_dan_5($int)
{

    if($int <= 5)
    {

        throw new Exception('FOUT: Het getal '.$int.' is niet groter dan 5');
    }

    return true;
}


groter_dan_5(4);
?>

Dit script levert de volgende foutmelding op:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
Fatal error: Uncaught exception 'Exception' with message 'FOUT: Het getal 4 is niet groter dan 5' in C:\wamp\www\test.php:9
Stack trace: #0 C:\wamp\www\test.php(14): groter_dan_5(4) #1 {main} thrown in C:\wamp\www\test.php on line 9

Zoals we zien is dit een PHP foutmelding van het level E_ERROR. Een fatale fout waarbij het script verder niet uitgevoerd wordt.

Deze foutmelding wordt veroorzaakt omdat we de exception die we 'gegooid' hebben naar PHP niet netjes afgevangen hebben. Het afvangen van exceptions doe je met een try-catch combinatie.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

function
groter_dan_5($int)
{

    if($int <= 5)
    {

        throw new Exception('FOUT: Het getal '.$int.' is niet groter dan 5');
    }

    return true;
}


try
{
    groter_dan_5(4);
}

catch(Exception $e)
{

    echo $e->getMessage();
}

?>

Zoals we zien is de output nu gelijk aan de foutmelding die we gegeven hebben:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
FOUT: Het getal 4 is niet groter dan 5

Het gooien van een exception kunnen we op elk willekeurig moment in een script doen, zolang we die exception maar netjes afvangen met een 'catch' blok. We hoeven dus ook niet per se een functie te gebruiken om een exception te kunnen gooien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

$getal = 4;
try
{
    if($getal <= 5)
    {

        throw new Exception('FOUT: Het getal '.$getal.' is niet groter dan 5');
    }

    echo 'Groter dan 5!';
}

catch(Exception $e)
{

    echo $e->getMessage();
}

?>

Ook hier krijgen we weer netjes de foutmelding:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
FOUT: Het getal 4 is niet groter dan 5

Zoals je ziet wordt nadat er een exception gegooid is, de rest van het try block niet meer uitgevoerd. In bovenstaand voorbeeld is het dus ook niet nodig om de echo in een else statement te zetten. Verander de waarde van $getal maar eens naar bijvoorbeeld 6 en bekijk de output van het script.

Een andere manier om die lelijke foutmelding te voorkomen, is het gebruik van een eigen exception handler. Net als met set_error_handler() kunnen we nu de functie set_exception_handler() gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

function
myExceptionHandler($e)
{

    echo 'FOUT: Er is een exception niet opgevangen.<br />';
    echo 'Melding: '.$e->getMessage();
}


set_exception_handler('myExceptionHandler');

$getal = 4;
if($getal <= 5)
{

    throw new Exception('FOUT: Het getal '.$getal.' is niet groter dan 5');
}

echo 'Groter dan 5!';
?>

De output is nu als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
FOUT: Er is een exception niet opgevangen.
Melding: FOUT: Het getal 4 is niet groter dan 5

Het grote voordeel van de try-catch combinatie is echter dat je zelf kunt bepalen wanneer je een fout wilt afhandelen. Als een exception gegooid wordt en hij wordt nergens afgevangen, dan wordt direct de exception handler functie uitgevoerd en de rest van het script onderbroken.

Als je echter netjes met een catch blok de exception afvangt, loopt het script gewoon netjes door. Het afvangen van de fout zou bij wijze van spreken pas honderden regels code later gebeuren, zonder dat de rest van het script daar hinder van ondervindt.

« Lees de omschrijving en reacties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.