Erreurs et exceptions rencontrées par les programmeurs PHP Erreurs de la partie 1

不言
Libérer: 2023-03-23 11:48:02
original
2089 Les gens l'ont consulté

Le contenu de cet article concerne les erreurs et exceptions rencontrées par les programmeurs PHP. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

1 Introduction au module d'erreur en PHP

Les erreurs et exceptions PHP sont deux concepts différents

1.1 Types d'erreurs

  1. Erreurs de syntaxe, telles que les points-virgules manquants

  2. Erreurs environnementales, telles que les autorisations, échec d'ouverture de fichiers, serveur de base de données indisponible

  3. Erreurs logiques, telles que a==b écrit sous la forme a=b

1.2 Niveaux d'erreur courants PHP

  1. L'erreur de niveau le plus bas (obsolète), non recommandée, comme le remplacement de l'ancienne version de la fonction Depracated standard C'est cela, cela n'affecte pas l'exécution de PHP) ereg()

  2. Erreur de niveau de notification (causée par une syntaxe incorrecte, n'affecte pas le fonctionnement normal de PHP, comme l'impression d'une variable non définie , il faut donc développer de bonnes pratiques d'écriture dès le début) Notice

  3. Niveau d'avertissement erreurs (le code doit être modifié) Warning

  4. Erreurs de niveau fatales, Fatal error程序会停止

  5. Erreurs d'analyse de syntaxe, vérifiez avant d'exécuter le code, Parse error将无法执行代码

  6. Erreurs définies par l'utilisateur, utilisées lors du lancement manuel des erreurs E_USER_相关的错误

1.3 Comment définir le niveau d'erreur

1.3. 1 Fichier de configuration php.ini

error_reporting=E_ALL & ~E_NOTICE # 显示所有但不显示提醒错误
display_errors = Off|On # 是否显示错误,线上后关闭提高用户体验
Copier après la connexion
1.3.2 Paramètres dynamiques

error_reporting() # 专业php错误处理设置函数,动态设置错误级别
error_reporting(0) # 不显示所有错误,但是解析parse语法错误会显示
error_reporting(-1) # 显示所有错误
Error_reporting(E_ALL|~E_WARING) # 除了警告错误以外的错误级别都报告
Copier après la connexion
1.3.3 Définir la valeur des options de configuration au moment de l'exécution

ini_set(option,value)

ini_set(error_reporting,0)
ini_set(error_reporting,-1)
ini_set(error_reporting,E_ALL)
ini_set(display_errors,0)
ini_set(display_errors,OFF/0)
error_reporting(-1);
Copier après la connexion
14 . trigger_error déclenche manuellement un suppresseur d'erreur

, placé en début de ligne pour ne pas afficher les erreurs dans la ligne @

Lance manuellement un message d'erreur personnalisé :

trigger_error('错误提示内容',E_USER_NOTICE)

 

Erreurs et exceptions rencontrées par les programmeurs PHP Erreurs de la partie 1

Niveau d'erreur :

E_USER_NOTICE # 继续执行(通知级别)
E_USER_WARNING # 继续执行(警告错误)
E_USER_ERROR # 程序不再执行(致命错误)
Copier après la connexion
2. Gestion des erreurs en PHP

2.1 Enregistrez le journal des erreurs dans le fichier spécifié

ini_set('display_errors','off') # 不显示错误给用户
ini_set("error_log","c:\error.log");       
error_reporting(-1); # 显示所有错误
Copier après la connexion
2.2 Enregistrez le journal des erreurs dans le journal système

ini_set("error_log", 'syslog')
Copier après la connexion
2.3 Envoyez le journal des erreurs par e-mail

error_log("this is a errormsg",1,xxxxx@qq.com);
Copier après la connexion
3. Gestionnaire d'erreurs personnalisé

3.1 set_error_handler Gestion des erreurs personnalisée

set_error_handler("自定义函数名",'错误级别(选填)') # 设置一个用户定义的错误处理函数    

restore_error_handler(); # 回收(取消自定义错误函数接管php系统错误)
Copier après la connexion

Erreurs et exceptions rencontrées par les programmeurs PHP Erreurs de la partie 1

3.2 Gestion des erreurs personnalisée

class MyErrorHandler{
    //错误信息
    public $message = '';
    //错误文件
    public $filename = '';
    //错误行号
    public $line = 0;
    //额外信息
    public $vars = array();
    protected $_noticelog = 'G:\notice\noticeLog.log';

    public function __construct($message, $filename, $line, $vars)
    {
        $this->message = $message;
        $this->filename = $filename;
        $this->line = $line;
        $this->vars = $vars;
    }
    //根据不同错误级别对应不同操作
    //遵循handler错误处理原则,errno:错误代码,line:错误行号
    public static function deal($errno,$errmsg,$filename,$line,$vars)
    {
        $self = new self($errmsg,$filename,$line,$vars);
        switch ($errno)
        {
            case E_USER_ERROR://致命级别
                return $self->dealError();
                break;
            case E_USER_WARNING://警告级别
            case E_WARNING:
                return $self->dealWarning();
                break;
            case E_NOTICE://通知级别
            case E_USER_NOTICE:
                return $self->dealNotice();
                break;
            default:
                return false;
        }
    }

    /**
     * 如何处理致命错误
     */
    public function dealError()
    {
        //开启内存缓冲
        ob_start();
        //回溯上一条信息
        debug_print_backtrace();
        $backtrace = ob_get_flush();
        $errorMsg = <<<EOF
        出现了致命错误,如下:
产生错误的文件:{$this->filename}
产生错误的信息:{$this->message}
产生错误的行号:{$this->line}
追踪信息:{$backtrace}
EOF;
//    error_log($errorMsg,1,&#39;xxxx@qq.com&#39;);
        error_log($errorMsg,3,$this->_noticelog);
        exit(1);
    }

    /**
     * 如何处理警告错误
     */
    public function dealWarning()
    {
        $errorMsg = <<<EOF
        出现了警告错误,如下:
产生警告的文件:{$this->filename}
产生警告的信息:{$this->message}
产生警告的行号:{$this->line}
EOF;
//        return error_log($errorMsg,1,&#39;xxx@qq.com&#39;);
        return error_log($errorMsg,3,$this->_noticelog);
    }

    /**
     * 如何处理通知错误
     */
    public function dealNotice()
    {
        $datetime = date(&#39;Y-m-d H:i:s&#39;,time());
        $errorMsg = <<<EOF
        出现了通知错误,如下:
产生通知的文件:{$this->filename}
产生通知的信息:{$this->message}
产生通知的行号:{$this->line}
产生通知的时间:{$datetime}
EOF;
        return error_log($errorMsg,3,$this->_noticelog);
    }
}
Copier après la connexion
3.3 Test du gestionnaire d'erreurs

require_once &#39;MyErrorHandler.php&#39;;
error_reporting(-1);
//使用MyErrorHandler类直接调用deal方法
/**
 * set_error_handler(array(类名/new 类名,方法名));
 * set_error_handler(函数名);
 */
set_error_handler(array(&#39;MyErrorHandler&#39;,&#39;deal&#39;));

//通知级别错误
echo $test;
//警告级别错误
settype($var,&#39;king&#39;);
//致命错误
//test();

//总结:手动抛出的信息会被显示在浏览器
trigger_error(&#39;我是手动抛出的致命错误&#39;,E_USER_ERROR);

echo &#39;this is a test &#39;;
Copier après la connexion
3.4 Utilisation de la fonction register_shutdown_function

Erreurs et exceptions rencontrées par les programmeurs PHP Erreurs de la partie 1

Scénarios d'utilisation :

  1. La page est forcée de s'arrêter

  2. Le code du programme se termine de manière inattendue ou expire

 

Erreurs et exceptions rencontrées par les programmeurs PHP Erreurs de la partie 1

 

La fonction est register_shutdown_function()从内存中调用, c'est-à-dire après l'exécution de l'instruction PHP (la page n'existe plus), Cette fonction est appelée, donc lors de l'écriture du chemin, elle est déjà hors du script, donc file_put_contents()路径要用绝对路径

error_get_last # 得到最后产生的错误
Copier après la connexion
 

Remarque : Si dans S'il y a register_shutdown_function() avant, il ne sera pas exécuté die/exit

n'est pas terminé ! A suivre dans le prochain article : 那些年,PHPer遇到的错误与异常:下篇之异常

Vidéo du cours de référence : Erreurs et exceptions que vous avez rencontrées au cours de ces années



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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal