mirror of
https://github.com/macintoshplus/doc-fr.git
synced 2026-03-29 04:12:21 +02:00
git-svn-id: https://svn.php.net/repository/phpdoc/fr/trunk@278265 c90b9560-bf6c-de11-be94-00142212c4b1
307 lines
8.4 KiB
XML
307 lines
8.4 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!-- $Revision: 1.17 $ -->
|
|
<!-- EN-Revision: 1.10 Maintainer: yannick Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
|
|
<chapter xml:id="language.exceptions" xmlns="http://docbook.org/ns/docbook">
|
|
<title>Les exceptions</title>
|
|
|
|
<para>
|
|
PHP 5 a une gestion des exceptions similaire à ce qu'offrent les autres
|
|
langages de programmation.
|
|
Une exception peut être lancée ("<literal>throw</literal>") et attrapée
|
|
("<literal>catch</literal>") dans PHP. Le code devra être entouré
|
|
d'un bloc <literal>try</literal> pour faciliter la saisie d'une exception
|
|
potentielle. Chaque <literal>try</literal> doit avoir au moins
|
|
un bloc <literal>catch</literal> correspondant. Plusieurs blocs
|
|
<literal>catch</literal> peuvent être utilisés pour attraper différentes
|
|
classes d'exceptions. L'exécution normal (lorsque aucune exception n'est lancée
|
|
dans le bloc <literal>try</literal> ou lorsqu'un <literal>catch</literal>
|
|
correspondant à l'exception lancée n'est pas présent) continue après le dernier
|
|
bloc <literal>catch</literal> défini dans la séquence. Les exceptions
|
|
peuvent être lancées (ou relancées) dans un bloc <literal>catch</literal>.
|
|
</para>
|
|
<para>
|
|
Lorsqu'une exception est jetée, le code suivant le traitement ne sera pas
|
|
exécuté et PHP tentera de trouver le premier bloc <literal>catch</literal> correspondant.
|
|
Si une exception n'est pas attrapé, une erreur fatale issue de PHP sera
|
|
envoyée avec un message spécifiant que l'exception n'a pu être attrapée à
|
|
moins qu'un gestionnaire ne soit défini avec la fonction
|
|
<function>set_exception_handler</function>.
|
|
</para>
|
|
<note>
|
|
<para>
|
|
Les fonctions internes de PHP utilisent principalement l'
|
|
<link linkend="ini.error-reporting">Error reporting</link>, seules les extensions
|
|
<link linkend="language.oop5">orientées objet</link>
|
|
utilisent les exceptions. Quoiqu'il en soit, des erreurs peuvent facilement être traduites en
|
|
exceptions avec <link linkend="class.errorexception">ErrorException</link>.
|
|
</para>
|
|
</note>
|
|
<tip>
|
|
<para>
|
|
La <link linkend="intro.spl">bibliothèque standard PHP (SPL)</link> fournit
|
|
un bon nombre d'exceptions en dur.
|
|
</para>
|
|
</tip>
|
|
<example>
|
|
<title>Lancer une exception</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
function inverse($x) {
|
|
if (!$x) {
|
|
throw new Exception('Division par zéro.');
|
|
}
|
|
else return 1/$x;
|
|
}
|
|
|
|
try {
|
|
echo inverse(5) . "\n";
|
|
echo inverse(0) . "\n";
|
|
} catch (Exception $e) {
|
|
echo 'Exception reçue : ', $e->getMessage(), "\n";
|
|
}
|
|
|
|
// Continue execution
|
|
echo 'Bonjour le monde !';
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
0.2
|
|
Exception reçue : Division par zéro.
|
|
Hello World
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
<example>
|
|
<title>Héritage d'une exception</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
|
|
class MyException extends Exception { }
|
|
|
|
class Test {
|
|
public function testing() {
|
|
try {
|
|
try {
|
|
throw new MyException('foo!');
|
|
} catch (MyException $e) {
|
|
/* on la relance */
|
|
throw $e;
|
|
}
|
|
} catch (Exception $e) {
|
|
var_dump($e->getMessage());
|
|
}
|
|
}
|
|
}
|
|
|
|
$foo = new Test;
|
|
$foo->testing();
|
|
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
&example.outputs;
|
|
<screen>
|
|
<![CDATA[
|
|
string(4) "foo!"
|
|
]]>
|
|
</screen>
|
|
</example>
|
|
|
|
<sect1 xml:id="language.exceptions.extending">
|
|
<title>Exceptions étendues</title>
|
|
<para>
|
|
Une classe Exception définie par l'utilisateur peut être définie en étendant
|
|
la classe Exception interne. Les membres et les propriétés suivantes
|
|
montrent ce qui est accessible dans la classe enfant qui est dérivée de la
|
|
classe exception interne.
|
|
</para>
|
|
<example>
|
|
<title>La classe Exception interne</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
class Exception
|
|
{
|
|
protected $message = 'exception inconnu'; // message de l'exception
|
|
protected $code = 0; // code de l'exception défini par l'utilisateur
|
|
protected $file; // nom du fichier source de l'exception
|
|
protected $line; // ligne de la source de l'exception
|
|
|
|
function __construct(string $message=NULL, int code=0);
|
|
|
|
final function getMessage(); // message de l'exception
|
|
final function getCode(); // code de l'exception
|
|
final function getFile(); // nom du fichier source
|
|
final function getLine(); // ligne du fichier source
|
|
final function getTrace(); // un tableau de backtrace()
|
|
final function getTraceAsString(); // chaîne formattée de trace
|
|
|
|
/* Remplacable */
|
|
function __toString(); // chaîne formatée pour l'affichage
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<para>
|
|
Si une classe étend la classe Exception interne et redéfinit le <link
|
|
linkend="language.oop5.decon">constructeur</link>, il est vivement
|
|
recommandé qu'elle appelle aussi
|
|
<link linkend="language.oop5.paamayim-nekudotayim">
|
|
<literal>parent::__construct()</literal></link>
|
|
pour s'assurer que toutes les données disponibles ont été proprement
|
|
assignées. La méthode
|
|
<link linkend="language.oop5.magic">__toString()</link> peut être réécrite
|
|
pour fournir un affichage personnalisé lorsque l'objet est présenté comme
|
|
une chaîne.
|
|
</para>
|
|
<example>
|
|
<title>Étendre la classe Exception</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
/**
|
|
* Définition d'une classe d'exception personnalisée
|
|
*/
|
|
class MyException extends Exception
|
|
{
|
|
// Redéfinissez l'exception ainsi le message n'est pas facultatif
|
|
public function __construct($message, $code = 0) {
|
|
|
|
// traitement personnalisé que vous voulez réaliser ...
|
|
|
|
// assurez-vous que tout a été assigné proprement
|
|
parent::__construct($message, $code);
|
|
}
|
|
|
|
// chaîne personnalisé représentant l'objet
|
|
public function __toString() {
|
|
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
|
|
}
|
|
|
|
public function customFunction() {
|
|
echo "Une fonction personnalisée pour ce type d'exception\n";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Création d'une classe pour tester l'exception
|
|
*/
|
|
class TestException
|
|
{
|
|
public $var;
|
|
|
|
const THROW_NONE = 0;
|
|
const THROW_CUSTOM = 1;
|
|
const THROW_DEFAULT = 2;
|
|
|
|
function __construct($avalue = self::THROW_NONE) {
|
|
|
|
switch ($avalue) {
|
|
case self::THROW_CUSTOM:
|
|
// jète une exception personnalisé
|
|
throw new MyException('1 est un paramètre invalide', 5);
|
|
break;
|
|
|
|
case self::THROW_DEFAULT:
|
|
// jète l'exception par défaut.
|
|
throw new Exception('2 n\'est pas autorisé en tant que paramètre', 6);
|
|
|
|
break;
|
|
|
|
default:
|
|
// Aucune exception, l'objet sera créé.
|
|
$this->var = $avalue;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Exemple 1
|
|
try {
|
|
$o = new TestException(TestException::THROW_CUSTOM);
|
|
} catch (MyException $e) { // Devrait être attrapée
|
|
echo "Capture mon exception\n", $e;
|
|
$e->customFunction();
|
|
} catch (Exception $e) { // Sauté
|
|
echo "Capture l'exception par défaut\n", $e;
|
|
}
|
|
|
|
// Continue l'exécution
|
|
var_dump($o);
|
|
echo "\n\n";
|
|
|
|
|
|
//Exemple 2
|
|
try {
|
|
$o = new TestException(TestException::THROW_DEFAULT);
|
|
} catch (MyException $e) { // Ne correspond pas à ce type
|
|
echo "Capture mon exception\n", $e;
|
|
$e->customFunction();
|
|
} catch (Exception $e) { // Devrait être attrapée
|
|
echo "Capture l'exception par défaut\n", $e;
|
|
}
|
|
|
|
// Continue l'exécution
|
|
var_dump($o);
|
|
echo "\n\n";
|
|
|
|
|
|
// Exemple 3
|
|
try {
|
|
$o = new TestException(TestException::THROW_CUSTOM);
|
|
} catch (Exception $e) { // Devrait être attrapée
|
|
echo "Capture l'exception par défaut\n", $e;
|
|
}
|
|
|
|
// Continue l'exécution
|
|
var_dump($o);
|
|
echo "\n\n";
|
|
|
|
|
|
// Exemple 4
|
|
try {
|
|
$o = new TestException();
|
|
} catch (Exception $e) { // sauté, aucune exception
|
|
echo "Capture l'exception par défaut\n", $e;
|
|
}
|
|
|
|
// Continue l'exécution
|
|
var_dump($o);
|
|
echo "\n\n";
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</sect1>
|
|
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"../../manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|