Uitgebreide foutafhandeling met gebruik van foutco

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 (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
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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.

« 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.