日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php错误拦截机制,php拦截异常怎么写-PHP问题

發布時間:2023/12/1 php 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php错误拦截机制,php拦截异常怎么写-PHP问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

php攔截異??梢酝ㄟ^PHP的錯誤、異常機制及其內建數'set_exception_handler'、'set_error_handler'、'register_shutdown_function' 來寫。

首先我們定義錯誤攔截類,該類用于將錯誤、異常攔截下來,用我們自己定義的處理方式進行處理,該類放在文件名為'errorHandler.class.php'中,代碼如下/**

* 文件名稱:baseErrorHandler.class.php

* 摘 要:錯誤攔截器父類

*/

require 'errorHandlerException.class.php';//異常類

class errorHandler

{

public $argvs = array();

public $memoryReserveSize = 262144;//備用內存大小

private $_memoryReserve;//備用內存

/**

* 方 法:注冊自定義錯誤、異常攔截器

* 參 數:void

* 返 回:void

*/

public function register()

{

ini_set('display_errors', 0);

set_exception_handler(array($this, 'handleException'));//截獲未捕獲的異常

set_error_handler(array($this, 'handleError'));//截獲各種錯誤 此處切不可掉換位置

//留下備用內存 供后面攔截致命錯誤使用

$this->memoryReserveSize > 0 && $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize);

register_shutdown_function(array($this, 'handleFatalError'));//截獲致命性錯誤

}

/**

* 方 法:取消自定義錯誤、異常攔截器

* 參 數:void

* 返 回:void

*/

public function unregister()

{

restore_error_handler();

restore_exception_handler();

}

/**

* 方 法:處理截獲的未捕獲的異常

* 參 數:Exception $exception

* 返 回:void

*/

public function handleException($exception)

{

$this->unregister();

try

{

$this->logException($exception);

exit(1);

}

catch(Exception $e)

{

exit(1);

}

}

/**

* 方 法:處理截獲的錯誤

* 參 數:int $code 錯誤代碼

* 參 數:string $message 錯誤信息

* 參 數:string $file 錯誤文件

* 參 數:int $line 錯誤的行數

* 返 回:boolean

*/

public function handleError($code, $message, $file, $line)

{

//該處思想是將錯誤變成異常拋出 統一交給異常處理函數進行處理

if((error_reporting() & $code) && !in_array($code, array(E_NOTICE, E_WARNING, E_USER_NOTICE, E_USER_WARNING, E_DEPRECATED)))

{//此處只記錄嚴重的錯誤 對于各種WARNING NOTICE不作處理

$exception = new errorHandlerException($message, $code, $code, $file, $line);

$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);

array_shift($trace);//trace的第一個元素為當前對象 移除

foreach($trace as $frame)

{

if($frame['function'] == '__toString')

{//如果錯誤出現在 __toString 方法中 不拋出任何異常

$this->handleException($exception);

exit(1);

}

}

throw $exception;

}

return false;

}

/**

* 方 法:截獲致命性錯誤

* 參 數:void

* 返 回:void

*/

public function handleFatalError()

{

unset($this->_memoryReserve);//釋放內存供下面處理程序使用

$error = error_get_last();//最后一條錯誤信息

if(errorHandlerException::isFatalError($error))

{//如果是致命錯誤進行處理

$exception = new errorHandlerException($error['message'], $error['type'], $error['type'], $error['file'], $error['line']);

$this->logException($exception);

exit(1);

}

}

/**

* 方 法:獲取服務器IP

* 參 數:void

* 返 回:string

*/

final public function getServerIp()

{

$serverIp = '';

if(isset($_SERVER['SERVER_ADDR']))

{

$serverIp = $_SERVER['SERVER_ADDR'];

}

elseif(isset($_SERVER['LOCAL_ADDR']))

{

$serverIp = $_SERVER['LOCAL_ADDR'];

}

elseif(isset($_SERVER['HOSTNAME']))

{

$serverIp = gethostbyname($_SERVER['HOSTNAME']);

}

else

{

$serverIp = getenv('SERVER_ADDR');

}

return $serverIp;

}

/**

* 方 法:獲取當前URI信息

* 參 數:void

* 返 回:string $url

*/

public function getCurrentUri()

{

$uri = '';

if($_SERVER ["REMOTE_ADDR"])

{//瀏覽器瀏覽模式

$uri = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];

}

else

{//命令行模式

$params = $this->argvs;

$uri = $params[0];

array_shift($params);

for($i = 0, $len = count($params); $i < $len; $i++)

{

$uri .= ' ' . $params[$i];

}

}

return $uri;

}

/**

* 方 法:記錄異常信息

* 參 數:errorHandlerException $e 錯誤異常

* 返 回:boolean 是否保存成功

*/

final public function logException($e)

{

$error = array(

'add_time' => time(),

'title' => errorHandlerException::getName($e->getCode()),//這里獲取用戶友好型名稱

'message' => array(),

'server_ip' => $this->getServerIp(),

'code' => errorHandlerException::getLocalCode($e->getCode()),//這里為各種錯誤定義一個編號以便查找

'file' => $e->getFile(),

'line' => $e->getLine(),

'url' => $this->getCurrentUri(),

);

do

{

//$e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage() . '(' . $e->getCode() . ')'

$message = (string)$e;

$error['message'][] = $message;

} while($e = $e->getPrevious());

$error['message'] = implode("\r\n", $error['message']);

$this->logError($error);

}

/**

* 方 法:記錄異常信息

* 參 數:array $error = array(

* 'time' => int,

* 'title' => 'string',

* 'message' => 'string',

* 'code' => int,

* 'server_ip' => 'string'

* 'file' => 'string',

* 'line' => int,

* 'url' => 'string',

* );

* 返 回:boolean 是否保存成功

*/

public function logError($error)

{

/*這里去實現如何將錯誤信息記錄到日志*/

}

}

上述代碼中,有個'errorHandlerException'類,該類放在文件'errorHandlerException.class.php'中,該類用于將錯誤轉換為異常,以便記錄錯誤發生的文件、行號、錯誤代碼、錯誤信息等信息,同時其方法'isFatalError'用于辨別該錯誤是否是致命性錯誤。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的php错误拦截机制,php拦截异常怎么写-PHP问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。