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'用于辨別該錯誤是否是致命性錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378502.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能車復工日記【4】:關于圖像的上下位機的調整問題總結

系列文章 【智能車Code review】—曲率計算、最小二乘法擬合 【智能車Code review】——坡道圖像與控制處理 【智能車Code review】——拐點的尋找 【智能車Code review】——小S與中S道路判斷 【智能車Code review】——環島的判定與補線操作 智能車復工日記【1】——菜單索引…

設計合理的實驗方案來研究陽離子改性棉織物與未改性棉的染色動力學性能

染色動力學性能研究染色的什么問題?設計合理的實驗方案來研究陽離子改性棉織物與未改性棉的染色動力學性能?并指出如何計算反映染色動力學的主要參數? 標準答案: 染色動力學研究染色速率問題。 為了研究陽離子改性棉纖維及未改性棉纖維對活性染料染色動力學性能,首先要測…

Java ArrayList toArray()方法及示例

ArrayList類的toArray()方法 (ArrayList Class toArray() method) Syntax: 句法&#xff1a; public Object[] toArray();public T[] toArray(T[] elements);toArray() method is available in java.util package. toArray()方法在java.util包中可用。 toArray() method is us…

小練習:新聞網站、SNS網站圖片播放器jQuery版

新聞網站和sns網站常見的圖片瀏覽器。直接看效果吧&#xff0c;效果預覽&#xff1a;http://u.vps168.com.cn/cos2004/photoView/&#xff0c; ie7、ie8、ff預覽正常&#xff0c;ie6和chrome預覽有一點小問題&#xff0c;研究中 作者&#xff1a;綠色花園 出處&#xff1a;htt…

SQL SERVER的鎖機制(四)——概述(各種事務隔離級別發生的影響)

SQL SERVER的鎖機制&#xff08;一&#xff09;——概述&#xff08;鎖的種類與范圍&#xff09; SQL SERVER的鎖機制&#xff08;二&#xff09;——概述&#xff08;鎖的兼容性與可以鎖定的資源&#xff09; 本文上接SQL SERVER的鎖機制&#xff08;三&#xff09;——概述&a…

如何測定拼色染液中,各染料在不同染色時間時,染液中殘留染料量及織物上吸附上染的染料量?

如何測定拼色染液中,各染料在不同染色時間時,染液中殘留染料量及織物上吸附上染的染料量? 標準答案: 通常依據各染料對特定波長光的吸光度具有加和性;吸光度值符合朗伯比爾定律,吸光度與濃度成正比;吸光度值分光光度計可以讀出;通過聯立方程,可以求出拼色各染料在染液中…

oracle云數據庫 免費的嗎,使用免費的Oracle云服務-創建ATP數據庫

前面我們講了在Oracle的云主機安裝數據庫&#xff0c;雖然現在安裝數據庫已經很簡單了&#xff0c;但是真正要在生產環境使用&#xff0c;還是需要進行很多配置和優化的&#xff0c;這通常需要專業的人員。而ATP(自治事務性數據庫服務)正是Oracle云提供的非常強大的數據庫云服務…

golang判斷結構體為空_如何在Golang中檢查結構是否為空?

golang判斷結構體為空The size of an empty structure is zero in Golang. Here, empty structure means, there is no field in the structure. 在Golang中&#xff0c; 空結構的大小為零。 在此&#xff0c; 空結構表示該結構中沒有字段。 Eg: 例如&#xff1a; Type struc…

智能車復工日記【5】:起跑線的識別與車庫入庫

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 系列文章 【智能車Code review】—曲率計算、最小二乘法擬合 【智能車Code review】——坡道圖像與控制處理 【智能車Code re…

文本框只允許輸入數字.net/javascript

<input type"text" name"test" onKeyUp"test1.value(this.valuethis.value.replace(/\D/g,).substring(0,6)).substring(0,3)" > <br /><input name"test1" type"text" > 用Up和Down有區別 只能輸入數字、…

jquery全選,jquery全不選,jquery反選

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <title>全選&#xff0c;不…

obj[]與obj._Ruby中帶有示例的Array.rassoc(obj)方法

obj[]與obj.Array.rassoc(obj)方法 (Array.rassoc(obj) Method) In this article, we will study about Array.rassoc(obj) method. You all must be thinking the method must be doing something which is related to the insertion of a certain element. It is not as simp…

oracle平均活動會話數,Oracle11g r2的活動會話數問題解決

如果你在Oracle11g r2的活動會話數的實際操作中&#xff0c;你對Oracle11g r2的活動會話數有不解之處時&#xff0c;你可以通過以下的文章對其的實際應用與功能有所了解&#xff0c;以下是文章的具體介紹&#xff0c;望你瀏覽完以下的內容會有所收獲。在Oracle11g r2的活動會話…

請分析比較下列四種染料在相同濃度和相同溫度的水染液中的聚集度大小?

請分析比較下列四種染料在相同濃度和相同溫度的水染液中的聚集度大小? 標準答案: 染料聚集度從大到小的順序為:3〉1〉4〉2 比較1-4染料結構差異,1、2共軛體系較短,3、4共軛體系較長,1、3磺酸基在端部,2、4磺酸基在中間; 染料3共軛體系長,范德華力大,而水溶性磺酸基團…

分割范圍Codeforces Round #181 (Div. 2)

每日一貼,今天的內容關鍵字為分割范圍 標題鏈接 A &#xff0c;B雖然是水題&#xff0c;但要是沒想清晰就易容掉進某個坑里。。 C&#xff1a;預處理出有所可能的和&#xff0c;然后個每個每和分給a b兩個數 D&#xff1a;競賽的時候標題沒看懂&#xff0c;題意就是說在一個n*n…

VC++動態鏈接庫深入淺出(轉)

1.概論  先來闡述一下DLL(Dynamic Linkable Library)的概念&#xff0c;你可以簡單的把DLL看成一種倉庫&#xff0c;它提供給你一些可以直接拿來用的變量、函數或類。在倉庫的發展史上經歷了“無庫&#xff0d;靜態鏈接庫&#xff0d;動態鏈接庫”的時代。 靜態鏈接庫與動態鏈…

智能車復工日記【6】:有bug的模糊PID記錄

目錄 系列文章DYY Warning算法參考鏈接:代碼.c文件.h文件調用方法希望有大佬能幫我指正錯誤之處。以后假如有機會的話再搞這個模糊吧,頭疼!!!系列文章 【智能車Code review】—曲率計算、最小二乘法擬合 【智能車Code review】——坡道圖像與控制處理 【智能車Code review…

車刀 matlab,可轉位車刀的結構

內容介紹原文檔由會員 違規屏蔽12 發布摘 要隨著有限元技術的快速發展&#xff0c;結構優化在航空航天、建筑、汽車、工程機械等領域的結構設計方面應用越來越廣泛。在刀具行業中&#xff0c;新型刀具材料不斷涌現&#xff0c;刀具的結構也在不斷發展&#xff0c;目前針對刀具的…

DtCms.Model.Advertising.cs

using System; namespace DtCms.Model {/// <summary>/// 廣告位實體類Advertising/// </summary>[Serializable]public class Advertising{public Advertising(){ }#region Modelprivate int _id;private string _title;private int _adtype;private string _adre…

分析染色溫度對染色熱力學性能和染色動力學性能的影響?實際生產時,染色溫度選擇應考慮哪些因素?舉例說明?并闡明實現低溫染色的原理。

分析染色溫度對染色熱力學性能和染色動力學性能的影響?實際生產時,染色溫度選擇應考慮哪些因素?舉例說明?并闡明實現低溫染色的原理。 答:染料的結構包括物理結構和化學結構,溫度高低會影響染料結構,影響染料在染浴中的狀態,染料的溶解、聚集、電離等性能,從而影響染…