Explication détaillée de l'utilisation de la fonction php set_error_handler()

怪我咯
Libérer: 2023-03-13 12:12:02
original
1217 Les gens l'ont consulté

La fonction

set_error_handler() définit une fonction de gestion des erreurs définie par l'utilisateur.

Remarque : si cette fonction est utilisée, le gestionnaire d'erreurs PHP standard est contourné et le gestionnaire d'erreurs défini par l'utilisateur termine le script via die() si nécessaire.

Remarque : Si l'erreur se produit avant l'exécution du script (par exemple lorsqu'un fichier est téléchargé), le gestionnaire d'erreurs personnalisé ne sera pas appelé car il n'a pas été enregistré à ce moment-là.

Syntaxe

set_error_handler(errorhandler,E_ALL|E_STRICT);
Copier après la connexion
参数描述
errorhandler必需。规定用户错误处理函数的名称。
E_ALL|E_STRICT可选。规定显示何种错误报告级别的用户定义错误。默认是 "E_ALL"。

L'utilisation de set_error_handler est la suivante :

string set_error_handler ( callback error_handler [, int error_types])
Copier après la connexion

Nous utilisons maintenant la gestion des erreurs personnalisée pour filtrer le chemin réel. Supposons qu'il existe une variable $admin, que nous utilisons pour déterminer si le visiteur est un administrateur (cette détermination peut être effectuée par IP ou par ID utilisateur connecté)

//admin为管理员的身份判定,true为管理员。  
//自定义的错误处理函数一定要有这4个输入变量$errno,$errstr,$errfile,$errline,否则无效。  
function my_error_handler($errno,$errstr,$errfile,$errline)  
{  
    //如果不是管理员就过滤实际路径  
    if(!admin)  
    {  
        $errfile=str_replace(getcwd(),"",$errfile);  
        $errstr=str_replace(getcwd(),"",$errstr);  
    }  
    switch($errno)  
    {  
        case E_ERROR:  
        echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n";  
        echo "程序已经停止运行,请联系管理员。";  
        //遇到Error级错误时退出脚本  
        exit;  
        break;  

        case E_WARNING:  
        echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n";  
        break;  

        default:  
        //不显示Notice级的错误  
        break;  
    }  
}
Copier après la connexion

De cette façon, une gestion des erreurs est personnalisée fonction, alors comment confier la gestion des erreurs à cette fonction personnalisée ?

// 应用到类  
set_error_handler(array(&$this,"appError"));  

//示例的做法  
set_error_handler("my_error_handler");
Copier après la connexion

si simple, de cette façon, la contradiction entre la sécurité et la commodité du débogage peut être bien résolue. Et vous pouvez également réfléchir à rendre le message d’erreur plus beau pour qu’il corresponde au style du site Web.
L'auteur original a donné deux points qui méritent attention. Je les publierai ici, dans l'espoir d'attirer l'attention de nos compatriotes :
1 E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR et E_COMPILE_WARNING ne seront pas affectés par. cette La poignée est traitée, c'est-à-dire qu'elle sera affichée de la manière la plus originale. Cependant, ces erreurs sont causées par des erreurs de compilation ou du noyau PHP et ne se produiront pas dans des circonstances normales.
2. Après avoir utilisé set_error_handler(), error_reporting () sera invalide. Autrement dit, toutes les erreurs (à l'exception des erreurs ci-dessus) seront transmises à la fonction personnalisée pour traitement.
Enfin, donnez un exemple

//先定义一个函数,也可以定义在其他的文件中,再用require()调用  
function myErrorHandler($errno, $errstr, $errfile, $errline)  
{  
     //为了安全起见,不暴露出真实物理路径,下面两行过滤实际路径  
    $errfile=str_replace(getcwd(),"",$errfile);  
    $errstr=str_replace(getcwd(),"",$errstr);  

    switch ($errno) {  
    case E_USER_ERROR:  

     echo "<b>My ERROR</b> [$errno] $errstr<br />\n";  
        echo "  Fatal error on line $errline in file $errfile";  
        echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";  
        echo "Aborting...<br />\n";  
        exit(1);  
        break;  

    case E_USER_WARNING:  
        echo "<b>My WARNING</b> [$errno] $errstr<br />\n";  
        break;  

    case E_USER_NOTICE:  
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";  
        break;  

    default:  
        echo "Unknown error type: [$errno] $errstr<br />\n";  
        break;  
    }  

    /* Don&#39;t execute PHP internal error handler */  
    return true;  
}  

//下面开始连接MYSQL服务器,我们故意指定MYSQL端口为3333,实际为3306。  
$link_id=@mysql_pconnect("localhost:3333","root","password");  
set_error_handler(myErrorHandler);  
if (!$link_id) {  
    trigger_error("出错了", E_USER_ERROR);  
}
Copier après la connexion

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