PHP錯誤處理機制

PHP錯誤簡介

錯誤

? ? ? ? PHP提供了錯誤處理和日志記錄的功能. 這些函數(shù)允許你定義自己的錯誤處理規(guī)則蜈抓,以及修改錯誤記錄的方式. 這樣启绰,你就可以根據(jù)自己的需要,來更改和加強錯誤輸出信息以滿足實際需要.

? ? ? ? 常見的錯誤類型有:語法錯誤沟使、環(huán)境錯誤委可、邏輯錯誤。平時遇到的warning腊嗡、notice都是錯誤着倾,只是級別不同而已。

? ? ? ? 常見的錯誤級別有:Deprecated(最低級別)燕少、Notice(通知)屈呕、Warning(警告)、Fatal(致命)棺亭、Parser(語法解析),E_USER_相關(guān)錯誤蟋软。 ? ? 查看PHP所有的錯誤級別:PHP錯誤預定義常量

? ? ? ? 在 PHP 中镶摘,默認的錯誤處理很簡單。一條錯誤消息會被發(fā)送到瀏覽器岳守,這條消息帶有文件名凄敢、行號以及描述錯誤的消息。

下面將詳細介紹幾個常用的錯誤處理函數(shù):

錯誤處理函數(shù)

1湿痢、error_reporting ?設(shè)置PHP的報錯級別

1)通過修改PHP配置文件中的error_reporting選項值

? ? 如涝缝,在php.ini設(shè)置如下:error_reporting = E_ALL

2)通過error_reporting()函數(shù)設(shè)置

? ? 如:

? ? error_reporting(0);? // 關(guān)閉所有PHP錯誤報告

? ? error_reporting(-1);? // 報告所有 PHP 錯誤

? ? error_reporting(E_ALL); //和error_reporting(-1)一樣

3)通過ini_set() 函數(shù)運行時設(shè)置

? ? ini_set('error_reporting',E_ALL);?

2、display_errors?設(shè)置是否將錯誤信息

該選項設(shè)置是否將錯誤信息作為輸出的一部分顯示到屏幕譬重,或者對用戶隱藏而不顯示拒逮。

1) ini_set('display_errors',1);

2)在php.ini設(shè)置如下:display_errors = On

說明:display_errors設(shè)置為On, 會將錯誤顯示到瀏覽器上臀规,不管是On還是Off都會記錄到你錯誤日志里面滩援,前提是配置了錯誤日志log_errors和error_log

3、set_error_handler ?設(shè)置一個用戶定義的錯誤處理函數(shù)

1)如:set_error_handler('my_error'); //my_error()為自定義的錯誤處理方法塔嬉。

2)如果把自定義的錯誤封裝到了一個類上玩徊,則使用數(shù)組的方式調(diào)用:

set_error_handler(array('MyErrorHander' , 'deal'));? //MyErrorHander為錯誤類租悄,deal為處理方法。

3)set_error_handler()參數(shù)介紹如下:

set_error_handler()參數(shù)

注:?

1) 以下級別的錯誤不能由用戶定義的函數(shù)來處理:?

?E_ERROR恩袱、E_PARSE泣棋、E_CORE_ERRORE_CORE_WARNING畔塔、E_COMPILE_ERROR潭辈、E_COMPILE_WARNING,和在? 調(diào)用set_error_handler()函數(shù)所在文件中產(chǎn)生的大多數(shù)E_STRICT俩檬。

2)如果錯誤發(fā)生在腳本執(zhí)行之前(比如文件上傳時)萎胰,將不會? 調(diào)用自定義的錯誤處理程序因為它尚未在那時注冊。

4棚辽、trigger_error() ?產(chǎn)生一個用戶級別的 error/warning/notice 信息

bool?trigger_error?(string $error_msg [,int $error_type = E_USER_NOTICE] );

error_msg: 該 error 的特定錯誤信息技竟,長度限制在了1024個字符。超過1024長度的字符都會被截斷屈藐。

error_type: 該 error 所特定的錯誤類型榔组。僅 E_USER 系列常量對其有效,默認是E_USER_NOTICE联逻。

5搓扯、error_log —發(fā)送錯誤信息到某個地方

將錯誤記錄到指定日志中的方法:

1)在配制文件中:error_log = E:\phpStudy\MyError\test_error.txt

2)運行時設(shè)置:ini_set('error_log' , 'E:\phpStudy\MyError\test_error.txt');

3)使用error_log函數(shù):error_log("You messed up!",3,"./error/my-errors.log");

將錯誤記錄到系統(tǒng)日志當中:

運行時配置如:ini_set('error_log' , 'syslog'); 這個比較少用,具體查看方法這里不做多介紹包归,可以自行百度或google锨推。

將錯誤發(fā)送到指定郵箱:

如:error_log('當前系統(tǒng)被人攻擊啦,產(chǎn)生致命錯誤9馈;豢伞!' , 1 , '2737555@qq.com'); ?

當然厦幅,能成功發(fā)送的前提是得做好你的郵箱相關(guān)配制沾鳄。

6、error_get_last()? 獲取最后發(fā)生的錯誤

返回了一個關(guān)聯(lián)數(shù)組确憨,描述了最后錯誤的信息译荞,以該錯誤的 "type"、? ? "message"休弃、"file" 和 "line" 為數(shù)組的鍵吞歼。? 如果該錯誤由 PHP 內(nèi)置函數(shù)導致的,"message"會以該函數(shù)名開頭玫芦。? 如果還沒有錯誤則返回NULL浆熔。

注意:

1)使用@符號可以抑制錯誤輸出。

2)PHP配制文件中與錯誤相關(guān)選項

常用案例

例1、自定義錯誤處理函數(shù)

開始測試:

divide(0,1); ? 報錯如:My WARNING:[512] The denominator cannot be zero ! -- on line 30 in file E:\phpStudy\WWW\test\index.php

divide(3,0); ? 報錯如:My NOTICE:[1024] You numerator is zero, it just a notice . -- on line 34 in file E:\phpStudy\WWW\test\index.php ? 并繼續(xù)輸出計算結(jié)果:0

divide(3,'d'); ?報錯如:My ERROR:[256] denominator and numerator must be number ! ? ? ? Fatal error on line 27 in file E:\phpStudy\WWW\test\index.php, PHP 5.6.27 (WINNT) ? ? ?Aborting... ? 到這里就中斷會程序医增,下面還有程序也不會執(zhí)行慎皱。

divide(2); ? 在這里共報3個錯誤,如下:

divideee(3,'d'); ? 這里調(diào)用了PHP內(nèi)部的錯誤處理:Fatal error: Call to undefined function divideee() in?E:\phpStudy\WWW\test\index.php?on line?42 ??

說明——以下級別的錯誤不能由用戶定義的函數(shù)來處理: ? ? ?E_ERROR叶骨、E_PARSE茫多、E_CORE_ERRORE_CORE_WARNING忽刽、E_COMPILE_ERROR天揖、E_COMPILE_WARNING,和在? 調(diào)用set_error_handler()函數(shù)所在文件中產(chǎn)生的大多數(shù)E_STRICT跪帝。

---------- ? < 例1 測試結(jié)束 > ? -------------

參考:

官方手冊:http://php.net/manual/zh/book.errorfunc.php

個人博客:http://blog.csdn.net/hguisu/article/details/7464977

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末今膊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伞剑,更是在濱河造成了極大的恐慌斑唬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黎泣,死亡現(xiàn)場離奇詭異恕刘,居然都是意外死亡,警方通過查閱死者的電腦和手機抒倚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門褐着,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人托呕,你說我怎么就攤上這事含蓉。” “怎么了项郊?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵谴餐,是天一觀的道長。 經(jīng)常有香客問我呆抑,道長,這世上最難降的妖魔是什么汁展? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任鹊碍,我火速辦了婚禮,結(jié)果婚禮上食绿,老公的妹妹穿的比我還像新娘侈咕。我一直安慰自己,他們只是感情好器紧,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布耀销。 她就那樣靜靜地躺著,像睡著了一般铲汪。 火紅的嫁衣襯著肌膚如雪熊尉。 梳的紋絲不亂的頭發(fā)上罐柳,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音狰住,去河邊找鬼张吉。 笑死,一個胖子當著我的面吹牛催植,可吹牛的內(nèi)容都是我干的肮蛹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼创南,長吁一口氣:“原來是場噩夢啊……” “哼伦忠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稿辙,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤昆码,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后邓深,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體未桥,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年芥备,在試婚紗的時候發(fā)現(xiàn)自己被綠了冬耿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡萌壳,死狀恐怖亦镶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袱瓮,我是刑警寧澤缤骨,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站尺借,受9級特大地震影響绊起,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜燎斩,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一虱歪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栅表,春花似錦笋鄙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春找岖,著一層夾襖步出監(jiān)牢的瞬間陨倡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工宣增, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留玫膀,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓爹脾,卻偏偏與公主長得像帖旨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灵妨,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 文件加載 語法形式:include解阅、include_once、require泌霍、require_once4 種語法都...
    THEyAnJ閱讀 555評論 0 1
  • php.ini設(shè)置,上傳大文件: post_max_size = 128Mupload_max_filesize ...
    bycall閱讀 6,774評論 3 64
  • 簡介 PHP提供了錯誤處理和日志記錄的功能. 這些函數(shù)允許你定義自己的錯誤處理規(guī)則货抄,以及修改錯誤記錄的方式. 這樣...
    零一間閱讀 642評論 0 2
  • PHP7 已經(jīng)出來1年了,PHP7.1也即將和大家見面朱转,這么多好的特性蟹地,好的方法,為什么不使用呢藤为,也希望PHP越來...
    夢幻_78af閱讀 2,100評論 1 10
  • Welcome 目前網(wǎng)絡(luò)上充斥著大量的陳舊信息怪与,讓PHP新手誤入歧途,傳播著錯誤的實踐和糟糕的代碼缅疟,這必須得到糾正...
    layjoy閱讀 21,680評論 7 118