Foutafhandeling in PHP (Error Handling)
- Inleiding
- Weergave en interpretatie van PHP fouten
- Basis foutafhandeling met die()
- Een flexibelere manier: trigger_error()
- Foutafhandeling en controle van variabelen
- Een eigen foutafhandeling functie met set_error_handler()
- Exceptions in PHP 5
- Gedetailleerde foutinformatie verkrijgen met exceptions
- Uitgebreide foutafhandeling met gebruik van foutcodes
- Uitbreiden van de standaard Exception klasse
- Slotwoord en referenties
- 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
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();
}
}
?>
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
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...
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.