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. Cet article présentera en détail comment PHP génère des exceptions et détecte des types spécifiques d'exceptions. J'espère qu'il sera utile à tout le monde.
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 de cet article : PHP5.5.36 Safari 9.1.2
1 <?php 2 header("content-type:text/html; charset=utf-8"); 3 /** 4 * 包裹重量异常 5 */ 6 class HeavyParcelException extends Exception {} 7 8 /** 9 * 包裹类 10 */ 11 class Parcel { 12 13 /** 14 * 包裹寄送目的地地址 15 */ 16 public $address; 17 18 /** 19 * 包裹重量 20 */ 21 public $weight; 22 } 23 24 /** 25 * 派送员 26 */ 27 class Courier { 28 29 /** 30 * 运送 31 */ 32 public function ship(Parcel $parcel) { 33 //check we have an address 34 //如果包裹的目的地为空 35 if(empty($parcel->address)) { 36 throw new Exception('address not Specified(未填写地址)!'); 37 } 38 39 //check the weight 40 //如果重量超过5 41 if($parcel->weight > 5) { 42 throw new HeavyParcelException('Parcel exceeds courier limit(包裹超过运送上限)!'); 43 } 44 45 //otherwise we're coll 46 return true; 47 } 48 } 49 50 $myCourier = new Courier(); 51 $parcel = new Parcel(); 52 //add the address if we have it 为了测试这里不填写地址 53 $parcel->weight = 7; 54 try { 55 $myCourier->ship($parcel); 56 echo "parcel shipped"; 57 } catch (HeavyParcelException $e) {//捕获HeavyParcelException 不写这个异常的类型名字,就跑到普通Exception抛出去了 58 echo "Parcel weight error(重量错误): " . $e->getMessage(); 59 //redirect them to choose another courier 60 } catch (Exception $e) { 61 echo "Someting went wrong(地址错误): " . $e->getMessage(); 62 //exit so we don't try to proceed any further 63 exit; 64 } 65 echo '<br/>'; 66 $a = 123; 67 echo $a;
La séquence d'exécution du code à partir de la ligne 54 :
55 >
32 >
35 (La méthode d'expédition vérifie d'abord que l'adresse est vide, et Exception
sera lancé ici au lieu de ligne 57 HeavyParcelException
) >
60 (capturé Exception
) >
616263 Erreur d'adresse de sortie exit
; Les lignes 65 à 67 ne seront pas sorties
Conseils :
Je pense que la chose la plus importante dans ce domaine est de déterminer l'ordre d'exécution du code. É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
Recommandations associées :
Personnalisation du gestionnaire d'exceptions PHP
Comment PHP implémente la reconnaissance d'image
Comment PHP implémente le verrouillage de processus et le multi-processus
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!