Beruflich Dokumente
Kultur Dokumente
Achref El Mouelhi
elmouelhi.achref@gmail.com
1 Introduction
2 Capture d’exception
3 Exceptions personnalisées
4 Multi-catch
5 Exceptions paramétrées
6 Bloc finally
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
PHP
PHP
Considérons la fonction division définie dans index.php
I c
ELH
U
L MO
f E
chre
c A
PHP
Considérons la fonction division définie dans index.php
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
PHP
Considérons la fonction division définie dans index.php
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
PHP
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;
}
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
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
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
Il faut le récupérer
PHP
PHP
PHP
PHP
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
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
}
PHP
Supposons que
codePostal doit contenir exactement 5 chiffres
I c
ELH
U
L MO
f E
c hre
c A
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
PHP
}
c A
exactement 5 chiffres");
function __destruct()
{}
}
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()
}
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
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é
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
PHP
PHP
c
throw new IncorrectStreetNameException();
}
die();
c A
$this->rue = $rue;
$this->ville = $ville;
$this->codePostal = $codePostal;
}
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
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é
PHP
} c A
$e->getMessage();
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
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()
{}
}
function __destruct()
{}
}
PHP
c
throw new IncorrectStreetNameException($rue);
}
die();
c A
$this->rue = $rue;
$this->ville = $ville;
$this->codePostal = $codePostal;
}
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
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é
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
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
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";
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