php set_error_handler()函數使用詳解

怪我咯
發布: 2023-03-13 12:12:02
原創
1213 人瀏覽過

set_error_handler() 函數設定使用者定義的錯誤處理函數。

註解:如果使用函數,會繞過標準 PHP 錯誤處理程序,同時如果必要,使用者定義錯誤程序透過 die() 終止腳本。

註解:如果錯誤發生在腳本執行之前(例如檔案上傳時),則不會呼叫自訂的錯誤處理程序因為它尚未在那時註冊。

語法

set_error_handler(errorhandler,E_ALL|E_STRICT);
登入後複製
參數#描述
errorhandler 必要。規定使用者錯誤處理函數的名稱。
E_ALL|E_STRICT可選。規定顯示何種錯誤報告等級的使用者定義錯誤。預設是 "E_ALL"。

set_error_handler的使用方法如下:

string set_error_handler ( callback error_handler [, int error_types])
登入後複製

現在我們就用自訂的錯誤處理把實際路徑過濾掉。假設有一個變數$admin,我們是用來判斷訪客是否是管理員的(可以透過IP或登入的使用者id來做這個判斷)

//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;  
    }  
}
登入後複製

這樣就自訂了一個錯誤處理函數,那要怎麼把錯誤的處理交給這個自訂函數呢?

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

//示例的做法  
set_error_handler("my_error_handler");
登入後複製

so easy,這樣,就可以很好地解決安全和調試方便的矛盾了。而且你還可以花點心思,讓錯誤提示更美觀以配合網站的風格。
原作者給了兩點需要注意的地方,我也放出來吧,希望引起廣大同胞們的注意:
1、E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING是不會被這個句柄處理的,也就是會用最原始的方式顯示出來。不過出現這些錯誤都是編 譯或PHP內核出錯,在通常情況下不會發生。
2、使用set_error_handler()後,error_reporting ()將會失效。也就是所有的錯誤(除上述的錯誤)都會交給自訂的函數處理。
最後,出一個範例

//先定义一个函数,也可以定义在其他的文件中,再用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);  
}
登入後複製

以上是php set_error_handler()函數使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!