PHP錯誤處理 - set_error_handler()的用法


定義和用法

set_error_handler 設定用戶自定義的錯誤處理函數. 方便用戶自己定義來處理運行中的錯誤.

語法

set_error_handler ( callable $errror_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

參數

參數       描述
error_handler 必須。規定發生錯誤時運行的函數
error_types 可選。規定在哪個錯誤報告級別會顯示用戶定義的錯誤。默認是 "E_ALL"。

 

 

 

 

 

 

error_handler

以下格式的回調(callback): 可以傳入 null 重置處理程序到默認狀態。 除了可以傳入函數名,還可以傳入引用對象和對象方法名的數組。

handler ( int $errsn , string $errstr [, string $errfile [, int $errline [, array$errcontext]]] ) : bool

參數 描述
errno 必須。錯誤級別,是一個integer
errstr 必須。錯誤信息,是一個string
errfile 可選。錯誤的文件名,是一個string
errline 可選。錯誤的行號, 是一個integer

 

 

 

 

 

 

 

errcontext 在php7.2.0以后被棄用。

 

重點1: error_types里指定的錯誤類型都會繞過php標准錯誤處理程序, 除非回調函數返回了FALSE.

例子1: error_type 默認的是E_ALL, 因為沒有定義$a, 所以報Notic錯誤, 繞過了PHP標准錯誤處理程序,調用回調函數。

<?php

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    switch ($errno) {
    case E_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    case E_ERROR:
        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
        break;
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

$error_handler = set_error_handler("myErrorHandler");

if($a == 1) {
        echo 'test error';
}

 輸出:

My NOTICE</b> [8] Undefined variable: a

例子2:  利用error_reporting()函數 和 $errno 進行位與運算返回FALSE 或者在匹配的E_NOTICE中 return FALSE 就會走PHP標准錯誤處理程序.

<?php

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if ((error_reporting() & $errno)) {
        return false;
    }
    switch ($errno) {
    case E_NOTICE:
     //return FALSE; 
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

$error_handler = set_error_handler("myErrorHandler");

if($a == 1) {
        echo 'test error';
}

輸出:

PHP Notice:  Undefined variable: a in /root/testerror1.php on line 22

 

重點2: error_reporting()設置將不會起到作用而你的錯誤處理函數繼續會被調用, 不過仍然可以獲取error_reporting的當前值,並做處理.

例子: 設置error_reporting 為E_ERROR | E_WARNING | E_PARSE 去除E_NOTICE ,但是錯誤處理函數繼續被調用

<?php

error_reporting
(E_ERROR | E_WARNING | E_PARSE); function myErrorHandler($errno, $errstr, $errfile, $errline) { //if (!(error_reporting() & $errno)) { // return false; //} switch ($errno) { case E_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } $error_handler = set_error_handler("myErrorHandler"); if($a == 1) { echo 'test error'; }

輸出:

<b>My NOTICE</b> [8] Undefined variable: a<br />

 

重點3: 錯誤處理函數報錯后,程序依然進行,有需要的時候使用die()

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        return false;
    }
    switch ($errno) {
    case E_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    //die()
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

$error_handler = set_error_handler("myErrorHandler");

if($a == 1) {
        echo 'test error';
}
echo "hello";

輸出:

<b>My NOTICE</b> [8] Undefined variable: a<br />
hello

 

重點4: 如果錯誤發生在執行腳本之前, 將不會調用自定義的錯誤處理程序, 因為它尚未被注冊.

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        return false;
    }
    switch ($errno) {
    case E_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

if($a == 1) {
        echo 'test error';
}
$error_handler = set_error_handler("myErrorHandler");
echo "hello";

輸出:

PHP Notice:  Undefined variable: a in /root/testerror1.php on line 19
hello

 

重點5:error_handler 除了可以傳函數名,還可以傳數組或者對象

<?php

class errorHandler{
        public function myErrorHandler($errno, $errstr, $errfile, $errline) {
                if (!(error_reporting() & $errno)) {
                        return false;
                }
                switch($errno) {
                        case E_NOTICE:
                                echo "<b> My NOTICE</b> [$errno] $errstr <br />";
                                break;
                          default:
                                echo "Unknown error type: [$errno] $errstr<br />\n";
                                break;
                }
                return true;
        }
}
$error_handler = set_error_handler(array('errorHandler', 'myErrorHandler'));
if ( $a == 1) {
        echo "test error";
}

 

輸出:

My NOTICE [8] Undefined variable: a 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM