天天看点

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);
?>