Sie sind auf Seite 1von 40

PHP : Exception

Achref El Mouelhi

Docteur de l’université d’Aix-Marseille


Chercheur en programmation par contrainte (IA)
Ingénieur en génie logiciel

elmouelhi.achref@gmail.com

H & H: Research and Training 1 / 30


Plan

1 Introduction

2 Capture d’exception

3 Exceptions personnalisées

4 Multi-catch

5 Exceptions paramétrées

6 Bloc finally

H & H: Research and Training 2 / 30


Introduction

PHP

Exception ?
I c
C’est une erreur qui se produit pendantU
H
L de notre
Eécution
l’ex
programme
L MO
Une exception dansre
E
unfprogramme implique généralement son
A c
arrêt d’exécution
h
c

H & H: Research and Training 3 / 30


Introduction

PHP

Comment faire pour poursuivre l’exécution ?


I c

EL H
Repérer les blocs pouvant générer une exception
U
MO
Capturer l’exception correspondante
L
h
Afficher un message r e f Eà cette exception
relatif
A c
c
Continuer l’exécution

H & H: Research and Training 4 / 30


Introduction

PHP
Considérons la fonction division définie dans index.php

function division($var1, $var2)


{
return $var1 / $var2;
}

I c

ELH
U
L MO
f E
chre
c A

H & H: Research and Training 5 / 30


Introduction

PHP
Considérons la fonction division définie dans index.php

function division($var1, $var2)


{
return $var1 / $var2;
}

I c

ELH
U
Appeler la fonction division avec les paramètres suivants génère plusieurs erreurs

$x = ’a’;
L MO
$y = 0;
f E
hre
echo division($x / $y);
c
c A

H & H: Research and Training 5 / 30


Introduction

PHP
Considérons la fonction division définie dans index.php

function division($var1, $var2)


{
return $var1 / $var2;
}

I c

ELH
U
Appeler la fonction division avec les paramètres suivants génère plusieurs erreurs

$x = ’a’;
L MO
$y = 0;
f E
hre
echo division($x / $y);
c
c A

Le message affiché à l’exécution
Warning: A non-numeric value encountered in
C:\wamp64\www\cours-poo\index.php on line 16
Warning: Division by zero in C:\wamp64\www\cours-poo\index.php on line
16
NAN

H & H: Research and Training 5 / 30


Capture d’exception

PHP

Comment faire pour capturer une exception ?


I c
Utiliser throw pour lancer un objet de type Exception contenant
EL H
le message de l’exception
O U
Utiliser un bloc try { ... } L M
pour entourer une instruction
f E
hre
utilisant une instruction qui peut lancer une exception
c
c A

Utiliser un bloc catch { ... } pour capturer l’exception et
afficher le message envoyé

H & H: Research and Training 6 / 30


Capture d’exception

PHP
Modifions la déclaration de la fonction division
function division($var1, $var2)
{
if ($var2 == 0){
I c

throw new Exception("Le deuxième paramètre
ELH
doit être différent de 0");
U
die();
L MO
}
f E
chre
if (!is_numeric($var1) || !is_numeric($var2)){
c A

throw new Exception("Les deux paramètres
doivent être de type numérique");
die();
}
return $var1 / $var2;
}

H & H: Research and Training 7 / 30


Capture d’exception

PHP
Modifions l’appel de la fonction division en ajoutant les blocs try et catch

$x = ’a’;
$y = 0;
try {
echo division($x, $y);
} catch (Exception $e) {
I c

}
echo "Problème avec le.s paramètre.s";
ELH
U
L MO
f E
chre
c A

H & H: Research and Training 8 / 30


Capture d’exception

PHP
Modifions l’appel de la fonction division en ajoutant les blocs try et catch

$x = ’a’;
$y = 0;
try {
echo division($x, $y);
} catch (Exception $e) {
I c

}
echo "Problème avec le.s paramètre.s";
ELH
U
L MO
f E
hre
Le message affiché à l’exécution

c
c A
Problème avec le.s paramètre.s

H & H: Research and Training 8 / 30


Capture d’exception

PHP
Modifions l’appel de la fonction division en ajoutant les blocs try et catch

$x = ’a’;
$y = 0;
try {
echo division($x, $y);
} catch (Exception $e) {
I c

}
echo "Problème avec le.s paramètre.s";
ELH
U
L MO
f E
hre
Le message affiché à l’exécution

c
c A
Problème avec le.s paramètre.s

Constatation

Le message qu’on a défini au lancement de l’exception n’a pas été affiché

Il faut le récupérer

H & H: Research and Training 8 / 30


Capture d’exception

PHP

Pour afficher le message envoyé au lancement de l’exception


$x = ’a’;
$y = 0;
try {
I c

echo division($x, $y);
ELH
U
MO
} catch (Exception $e) {
echo echo $e->getMessage();
f E L
hre
}
c
c A

H & H: Research and Training 9 / 30


Capture d’exception

PHP

Pour afficher le message envoyé au lancement de l’exception


$x = ’a’;
$y = 0;
try {
I c

echo division($x, $y);
ELH
U
MO
} catch (Exception $e) {
echo echo $e->getMessage();
f E L
hre
}
c
c A

Le message affiché à l’exécution

Le deuxième paramètre doit être différent de 0

H & H: Research and Training 9 / 30


Capture d’exception

PHP

Pour afficher le deuxième message, modifions la deuxième valeur


$x = ’a’;
$y = 2;
try {
I c

echo division($x, $y);
ELH
U
MO
} catch (Exception $e) {
echo echo $e->getMessage();
f E L
hre
}
c
c A

H & H: Research and Training 10 / 30


Capture d’exception

PHP

Pour afficher le deuxième message, modifions la deuxième valeur


$x = ’a’;
$y = 2;
try {
I c

echo division($x, $y);
ELH
U
MO
} catch (Exception $e) {
echo echo $e->getMessage();
f E L
hre
}
c
c A

Le message affiché à l’exécution

Les deux paramètres doivent être de type numérique

H & H: Research and Training 10 / 30


Exceptions personnalisées

PHP

I c
Remarques
LH
Epersonnalis
O U
PHP nous permet de définir des exceptions ées
M
Lest une classe qui hérite de la
f E
Une exception personnalis
re
ée
c h
classe Exception
c A

H & H: Research and Training 11 / 30


Exceptions personnalisées

PHP
Considérons la classe Adresse suivante

class Adresse
{
private $rue;
private $ville;
I c
private $codePostal;
EL H
public function __construct(string U
M O $rue, string $codePostal
, string $ville)
fE L
{
h r e
c = $ville;
$this->rue = $rue;

A
$this->ville
c
$this->codePostal = $codePostal;
}
function __destruct()
{}
// ensuite les getters/setters et autres méthodes
}

H & H: Research and Training 12 / 30


Exceptions personnalisées

PHP

Supposons que
codePostal doit contenir exactement 5 chiffres
I c

ELH
U
L MO
f E
c hre
c A

H & H: Research and Training 13 / 30


Exceptions personnalisées

PHP

Supposons que
codePostal doit contenir exactement 5 chiffres
I c

ELH
U
L MO
Démarche à faire
f E
c hre
c A
Créer notre propre exception (qui doit étendre la classe
Exception)
Dans le constructeur de Adresse, on lance une exception si
codePostal ne contient pas 5 chiffres

H & H: Research and Training 13 / 30


Exceptions personnalisées

PHP

Créons l’exception IncorrectCodePostalException dans un


répertoire exceptions
class IncorrectCodePostalException extends Exception
{
I c
EL H
U
MO
public function __construct()
{
fE L
c h r
echo("Le code
e postal doit contenir

} c A
exactement 5 chiffres");

function __destruct()
{}
}

H & H: Research and Training 14 / 30


Exceptions personnalisées

Modifions le constructeur de la classe Adresse

class Adresse
{
private $rue;
private $ville;
private $codePostal;

$ville)
I c
public function __construct(string $rue, string $codePostal, string

{
ELH
if (strlen($codePostal) != 5) {
U
throw new IncorrectCodePostalException();
die();
L MO
f E
hre
}
$this->rue = $rue;
c
c A
$this->ville = $ville;

}
$this->codePostal = $codePostal;

function __destruct()
{}
// il faut faire pareil dans setCodePostal()
}

H & H: Research and Training 15 / 30


Exceptions personnalisées

PHP
Testons tout cela dans le index.php
$a = null;
try {
$a = new Adresse ("rue de paradis", "1300", "
I c

Marseille");
ELH
}
U
catch(IncorrectCodePostalException $icpe) {
L MO
$icpe->getMessage();
f E
}
c hre
c A

H & H: Research and Training 16 / 30


Exceptions personnalisées

PHP
Testons tout cela dans le index.php
$a = null;
try {
$a = new Adresse ("rue de paradis", "1300", "
I c

Marseille");
ELH
}
U
catch(IncorrectCodePostalException $icpe) {
L MO
$icpe->getMessage();
f E
}
c hre
c A

Le message affiché

Le code postal doit contenir exactement 5 chiffres

H & H: Research and Training 16 / 30


Multi-catch

PHP

I c

On peut rajouter une deuxième condition
E LH
U
MO 5 chiffres
codePostal doit contenir exactement
L
r e fE
rue doit être une chaı̂ne
h
en majuscule
A c
c

H & H: Research and Training 17 / 30


Multi-catch

PHP

Créons une deuxième exception IncorrectStreetNameException


dans le répertoire exceptions
class IncorrectStreetNameException extends Exception
I c

{
public function __construct() ELH
U
{
L MO
E
echo "Le nom de la rue doit être en
f
majuscule";
chre
}
c A

function __destruct()
{}
}

H & H: Research and Training 18 / 30


Multi-catch

PHP

Modifions le constructeur de la classe Adresse

public function __construct(string $rue, string $codePostal,


string $ville)
{
I c

if (strlen($codePostal) != 5) {
throw new IncorrectCodePostalException();
ELH
U
MO
die();
}
f E L
hre
if (strtoupper($rue) != $rue) {

c
throw new IncorrectStreetNameException();

}
die();
c A

$this->rue = $rue;
$this->ville = $ville;
$this->codePostal = $codePostal;
}

H & H: Research and Training 19 / 30


Multi-catch

PHP
Re-testons tout cela dans le index.php

$a = null;
try {
$a = new Adresse ("paradis", "13000", "Marseille");
}
I c

catch(IncorrectCodePostalException $icpe) {
ELH
$icpe->getMessage();
U
}
L MO
E
catch(IncorrectStreetNameException $isne) {
f
hre
$isne->getMessage();
}
c
c A

H & H: Research and Training 20 / 30


Multi-catch

PHP
Re-testons tout cela dans le index.php

$a = null;
try {
$a = new Adresse ("paradis", "13000", "Marseille");
}
I c

catch(IncorrectCodePostalException $icpe) {
ELH
$icpe->getMessage();
U
}
L MO
E
catch(IncorrectStreetNameException $isne) {
f
hre
$isne->getMessage();
}
c
c A

Le message affiché

Le nom de la rue doit être en majuscule

H & H: Research and Training 20 / 30


Multi-catch

PHP

Depuis PHP 7.1, on peut fusionner les catch


$a = null;
I c

try {
ELH
U
MO
$a = new Adresse ("paradis", "13000", "Marseille");
echo $a;
f E L
hre
}catch(IncorrectCodePostalException |
c
IncorrectStreetNameException $e) {

} c A

$e->getMessage();

H & H: Research and Training 21 / 30


Exceptions paramétrées

PHP

I c
Question
ELH
Comment faire si on veut afficher lesM
U
O qui ont déclenché
valeurs
l’exception dans le message ?E L
c h ref
c A

H & H: Research and Training 22 / 30


Exceptions paramétrées

PHP
Modifions la première exception
IncorrectCodePostalException
class IncorrectCodePostalException extends Exception
{
I c

H
EL $cp)
U
public function __construct(string
O
{
echo("Le code E L M
h r e f postal ’$cp’ doit contenir
c
exactement 5 chiffres");

} c A
function __destruct()
{}
}

H & H: Research and Training 23 / 30


Exceptions paramétrées

Les exceptions paramétrées

Modifions la deuxième exception


IncorrectStreetNameException
class IncorrectStreetNameException extends Exception
{
I c

H
EL $rue)
U
MO
public function __construct(string
{
L
Ela rue ’$rue’ doit être en
echo "Le nom fde
c h r e
} c A
majuscule";

function __destruct()
{}
}

H & H: Research and Training 24 / 30


Exceptions paramétrées

PHP

Modifions le constructeur de la classe Adresse

public function __construct(string $rue, string $codePostal,


string $ville)
{
I c

if (strlen($codePostal) != 5) {
throw new IncorrectCodePostalException($codePostal);
ELH
U
MO
die();
}
f E L
hre
if (strtoupper($rue) != $rue) {

c
throw new IncorrectStreetNameException($rue);

}
die();
c A

$this->rue = $rue;
$this->ville = $ville;
$this->codePostal = $codePostal;
}

H & H: Research and Training 25 / 30


Exceptions paramétrées

PHP

Pour tester
$a = null;
try {
$a = new Adresse ("paradis", "1300", "Marseille");
I c

}
ELH
catch(IncorrectCodePostalException |
U
IncorrectStreetNameException $e) {
L MO
$e->getMessage();
f E
}
chre
c A

H & H: Research and Training 26 / 30


Exceptions paramétrées

PHP

Pour tester
$a = null;
try {
$a = new Adresse ("paradis", "1300", "Marseille");
I c

}
ELH
catch(IncorrectCodePostalException |
U
IncorrectStreetNameException $e) {
L MO
$e->getMessage();
f E
}
chre
c A

Le message affiché

Le code postal ’1300’ doit contenir exactement 5 chiffres.

H & H: Research and Training 26 / 30


Exceptions paramétrées

PHP

Exercice I c
EL H
O U
Créer une nouvelle classe d’exception AdresseException pour
L M
fusionner et remplacer les deux exceptions
e
IncorrectCodePostalException
r f E et
c h
IncorrectStreetNameException
A
c

H & H: Research and Training 27 / 30


Bloc finally

PHP

I c
LH
Equ’une
O U
À utiliser lorsqu’on veut exécuter une instruction exception soit
levée ou non. L M
re f E
c h
c A

H & H: Research and Training 28 / 30


Bloc finally

PHP

Exemple
$a = null;
I c

try {
ELH
U
$a = new Adresse("paradis", "13000", "Marseille");
} catch (IncorrectCodePostalException |
L MO
IncorrectStreetNameException $e) {
f E
$e->getMessage();
chre
c A
} finally {

}

echo "Instruction exécutée systématiquement";

H & H: Research and Training 29 / 30


Bloc finally

PHP

I c
Remarque
E LH
U
return qui forcera l’arrêt de l’exL MOdu sicode.
Le bloc finally peut s’avérer intéressant le catch contient un

re
(finally) sera exécuté. f E écution Malgré cela, ce bloc

c h
c A

H & H: Research and Training 30 / 30

Das könnte Ihnen auch gefallen