La capture d'exceptions peut être facilement ajoutée dans de nombreux outils IDE actuels à l'aide de touches de raccourci pour empêcher les utilisateurs de voir des erreurs qu'ils ne peuvent pas comprendre ou même de planter inexplicablement, entraînant une mauvaise expérience utilisateur. Même l'affichage d'une invite de crash conviviale est bien meilleur que l'affichage direct de l'erreur : xxxx xxxxxxxxx. L'article suivant présentera en détail comment PHP génère des exceptions et intercepte des types spécifiques d'exceptions.
Qu'est-ce qu'une exception ?
PHP 5 fournit une nouvelle méthode de gestion des erreurs orientée objet.
La gestion des exceptions est utilisée pour modifier le flux normal du script lorsqu'une situation d'erreur (exception) spécifiée se produit. Cette situation est appelée une exception.
Lorsqu'une exception est déclenchée, ce qui se produit généralement est :
L'état actuel du code est enregistré
Code exécution Passé à la fonction de gestionnaire d'exceptions prédéfinie
Selon la situation, le gestionnaire peut redémarrer l'exécution du code à partir de l'état du code enregistré, terminer l'exécution du script ou continuer l'exécution du script à partir d'un autre emplacement dans le code
Nous montrerons différentes méthodes de gestion des erreurs :
Utilisation de base des exceptions
Création d'exceptions personnalisées Gestionnaire d'exceptions
Exceptions multiples
Relancer les exceptions
Définir un gestionnaire d'exceptions de niveau supérieur
php throw Le but ultime de lancer des exceptions et détecter des types spécifiques d'exceptions consiste à fournir des solutions correspondantes afin que le code puisse continuer à s'exécuter.
L'environnement de test pour cet article : PHP5.5.36 Safari 9.1.2
<?php header("content-type:text/html; charset=utf-8"); /** * 包裹重量异常 */ class HeavyParcelException extends Exception {} /** * 包裹类 */ class Parcel { /** * 包裹寄送目的地地址 */ public $address; /** * 包裹重量 */ public $weight; } /** * 派送员 */ class Courier { /** * 运送 */ public function ship(Parcel $parcel) { //check we have an address //如果包裹的目的地为空 if(empty($parcel->address)) { throw new Exception('address not Specified(未填写地址)!'); } //check the weight //如果重量超过5 if($parcel->weight > 5) { throw new HeavyParcelException('Parcel exceeds courier limit(包裹超过运送上限)!'); } //otherwise we're coll return true; } } $myCourier = new Courier(); $parcel = new Parcel(); //add the address if we have it 为了测试这里不填写地址 $parcel->weight = 7; try { $myCourier->ship($parcel); echo "parcel shipped"; } catch (HeavyParcelException $e) {//捕获HeavyParcelException 不写这个异常的类型名字,就跑到普通Exception抛出去了 echo "Parcel weight error(重量错误): " . $e->getMessage(); //redirect them to choose another courier } catch (Exception $e) { echo "Someting went wrong(地址错误): " . $e->getMessage(); //exit so we don't try to proceed any further exit; } echo '<br/>'; $a = 123; echo $a;
Séquence d'exécution du code à partir de la ligne 54 :
55 >
32 >
35(ship méthode La première chose à vérifier est que l'adresse est vide, et Exception
sera lancé ici à la place du HeavyParcelException
à la ligne 57) >
60 (capturé Exception
) >
616263 Erreur d'adresse de sortie exit
; les lignes 65 à 67 ne seront pas sorties
Conseils :
J'ai l'impression que le la chose la plus importante à ce sujet est de déterminer l’ordre dans lequel le code est exécuté. Écrivez quelques paragraphes, puis révisez-les et exécutez-les.
1. L'ordre de capture dépend du type de try
le code dans throw
, puis de l'ordre dans Exception
. catch
ne peut pas être écrit de manière incorrecte, sinon l'écriture de HeavyParcelException
posera des problèmes. Vous pouvez l'essayer vous-même. Exception
, l'erreur de poids sera capturée dans son objet de classe parent à la ligne 60. Ce n'est pas ce que nous voulons. HeavyParcelException111
, une erreur d'adresse sera générée, mais ce qui est capturé est le Exception
qui est à l'origine responsable du poids. Ce n’est pas non plus ce que nous souhaitons. catch
Explication détaillée de la façon de modifier le fichier hosts en PHP
Méthodes PHP pour implémenter l'exécution asynchrone de scripts
phpImplémenter la définition et l'utilisation de la classe de cache Redis
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!