Foutafhandeling in PHP (Error Handling)

  1. Inleiding
  2. Weergave en interpretatie van PHP fouten
  3. Basis foutafhandeling met die()
  4. Een flexibelere manier: trigger_error()
  5. Foutafhandeling en controle van variabelen
  6. Een eigen foutafhandeling functie met set_error_handler()
  7. Exceptions in PHP 5
  8. Gedetailleerde foutinformatie verkrijgen met exceptions
  9. Uitgebreide foutafhandeling met gebruik van foutcodes
  10. Uitbreiden van de standaard Exception klasse
  11. Slotwoord en referenties
  12. Reacties op deze tutorial

Uitgebreide foutafhandeling met gebruik van foutcodes

Bij de exceptions die we nu behandeld hebben, gaven we bij het gooien ervan een nette foutmelding mee. Echter kunnen we dit nog verder uitbreiden door naast een foutmelding ook een foutcode mee te geven. In het catch blok kunnen vervolgens aan de hand van deze foutcode verschillende acties uitvoeren.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
ini_set
('display_errors''On');
error_reporting(E_ALL);

class 
Gebruiker
{
    const 
NAME_ERROR 1;
    const 
AGE_ERROR 2;
    const 
AVATAR_ERROR 4;
    
    protected 
$sGebruikersnaam;
    protected 
$iLeeftijd;
    protected 
$sAvatar;
    protected 
$sDir 'avatars/';
    
    function 
__construct($sGebruikersnaam$iLeeftijd$sAvatar)
    {
        if(
strlen($sGebruikersnaam) < 3)
        {
            throw new 
Exception('Aanmaken instantie van "'.__CLASS__.'" mislukt.'self::NAME_ERROR);
        }
        if(!
is_numeric($iLeeftijd))
        {
            throw new 
Exception('Aanmaken instantie van "'.__CLASS__.'" mislukt.'self::AGE_ERROR);
        }
        if(!
file_exists($this->sDir.$sAvatar))
        {
            throw new 
Exception('Aanmaken instantie van "'.__CLASS__.'" mislukt.'self::AVATAR_ERROR);
        }
        
        
$this->sGebruikersnaam $sGebruikersnaam;
        
$this->iLeeftijd $iLeeftijd;
        
$this->sAvatar $sAvatar;
    }
}

try
{
    
$gebruiker = new Gebruiker('Henk'25'plaatje.png');
}
catch(
Exception $e)
{
    echo 
'Error: '.$e->getMessage().'<br />';
    echo 
'File: '.$e->getFile().'<br />';
    echo 
'Line: '.$e->getLine().'<br />';
    
    if(
$e->getCode() == 1)
    {
        echo 
'Details: De minimale lengte van een gebruikersnaam is 3 tekens.<br />';
    }
    elseif(
$e->getCode() == 2)
    {
        echo 
'Details: De opgegeven leeftijd is geen integer.<br />';
    }
    elseif(
$e->getCode() == 4)
    {
        echo 
'Details: Het opgegeven bestand bestaat niet. De uitvoer van het script wordt gestopt...';
        exit();
    }
}
?>

De output van dit script is als volgt:
Code
1
2
3
4
Error: Aanmaken instantie van "Gebruiker" mislukt.
File: C:\wamp\www\test.php
Line: 28
Details: Het opgegeven bestand bestaat niet. De uitvoer van het script wordt gestopt...

In dit script wordt er bij het gooien van een exception ook een foutcode als tweede parameter meegegeven. Vervolgens kunnen we in het catch blok met de getCode() methode deze foutcode ophalen en bepalen welke actie uitgevoerd moet worden.

In het voorbeeld zit de fout in het feit dat de gekozen avatar niet bestaat. De exception krijgt in dat geval de foutcode 4 (via de constante AVATAR_ERROR) mee. In het catchblok hangen we vervolgens een foutmelding aan deze code en stoppen we tevens de uitvoer van het verdere script.

Normaal gesproken zou je het bepalen van de foutmelding niet op deze manier op willen lossen. Je wilt namelijk dat de foutmelding direct al vanuit de klasse komt zodat je deze met $e->getMessage() kunt ophalen. Ik heb het nu alleen ter voorbeeld in het catch blok opgenomen om te illustreren hoe je met verschillende foutcodes verschillende acties zou kunnen uitvoeren.

Vorige Volgende