天天看點

PHP 使用回調函數(set_error_handler)處理異常和錯誤

 1、set_error_handler函數:指定出錯時指向我們自定義的錯誤句柄處理函數。

2、error_log函數:專門用于日記記錄。0:通過PHP标準的錯誤處理機制來記錄;1:郵件發生到指定的地方;3指定的檔案中

3、trigger_error函數:指定引發的錯誤類型。

<?php 
    // 錯誤處理函數
    function ErrorHandler($ErrNo, $ErrMsg, $File, $Line, $Vars)
    {
    	$Time = date("Y-m-d H:i:s"); // 錯誤發生時間
    	
    	// 将錯誤種類定義為關聯數組
    	$ErrorType = array(1=>"Error", 2=>"Warning", 4=>"Parsing Error", 
    			8=>"Notice", 16=>"Core Error", 32=>"Core Warning", 
    			64=>"Complice Error", 128=>"Compile Warning", 256=>"User Error",
    			512=>"User Warning", 1024=>"User Notice", 2048=>"Strict Notice");
    	$Err = <<<ERROR_MESSAGE
    	<errorentry>
    	    <time>$Time</time>
    	    <number>$ErrNo</number>
    	    <type>$ErrorType[$ErrNo]</type>
    	    <errmsg>$ErrMsg</errmsg>
    	    <filename>$File</filename>
    	    <linenum>$Line</linenum>
ERROR_MESSAGE;
        
        // 使用者定義的錯誤,通知的情況下記錄變量的值
        if($ErrNo & (E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE))
    	{
    		$Err .= "\n<vars>".serialize($vars)."</vars>";
    	}
    	$Err .= "\n</errorentry>\n";
    	
    	// 儲存到記錄
    	error_log($Err, 3, "error.log"); 
    	// 重大錯誤以Mail通知
    	if($ErrNo == E_ERROR || $ErrNo = E_USER_ERROR)
    	{
    		//mail("[email protected]", "錯誤發生通知中", $Err);
    		echo "對不起。因為系統發生問題,停止服務中。";
    		die();
    	}
    }
    
    set_error_handler("ErrorHandler");
    function divide($Num, $Den)
    {
    	if($Den == 0)
    	{
    		trigger_error("Cannot divide by zero", Warning);
    	}
    	else
    	{
    		return ($Num/$Den);
    	}
    }
    
    $val = SOME_STRING;
    echo divide(5, 0);
?>