Maison  >  Article  >  développement back-end  >  Explication détaillée de la capture de types spécifiques d'exceptions en php

Explication détaillée de la capture de types spécifiques d'exceptions en php

*文
*文original
2018-01-02 17:47:221551parcourir

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(&#39;address not Specified(未填写地址)!&#39;);
37     } 
38 
39     //check the weight
40     //如果重量超过5
41     if($parcel->weight > 5) {
42       throw new HeavyParcelException(&#39;Parcel exceeds courier limit(包裹超过运送上限)!&#39;);
43     } 
44 
45     //otherwise we&#39;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&#39;t try to proceed any further
63   exit;
64 }
65 echo &#39;<br/>&#39;;
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

La ligne 2.57 capture un type spécifique

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

1) Par exemple, si l'adresse n'est pas vide et que la ligne 57 est écrite comme

, 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

2) Par exemple, si l'adresse est vide et que la ligne 57 est écrite comme

, 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn