PHP錯誤與異常處理(二)

自定義錯誤處理器

?我們寫程序幻枉,難免會有問題(是經(jīng)常會遇到問題)碰声,而PHP遇到錯誤時,就會給出出錯腳本的位置熬甫、行數(shù)和原因胰挑。有很多人說,這并沒有什么大不了。確實(shí)洽腺,在調(diào)試程序階段脚粟,這確實(shí)是沒啥的覆旱,而且我認(rèn)為給出錯誤路徑是必要的蘸朋。但泄露了實(shí)際路徑的后果是不堪設(shè)想的,對于某些入侵者扣唱,這個信息可是非常重要藕坯,而事實(shí)上現(xiàn)在有很多的服務(wù)器都存在這個問題。

?? 有些人干脆把PHP配置文件中的display_errors設(shè)置為Off來解決(貌似我們就是這樣做的)噪沙,但本人認(rèn)為這個方法過于消極炼彪。有些時候,我們的確需要PHP返回錯誤的信息以便調(diào)試正歼。而且在出錯時也可能需要給用戶一個交待辐马,甚至導(dǎo)航到另一頁面。

?? 而set_error_handle函數(shù)就可以幫助我們放置錯誤信息泄露局义。

set_error_handler

set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

第一個參數(shù)是放置一個回調(diào)函數(shù)喜爷。第二個參數(shù)是設(shè)置哪些錯誤級別出現(xiàn)時觸發(fā)這個自定義的錯誤處理函數(shù)。

注:PHP中每一個錯誤的觸發(fā)幾乎都會產(chǎn)生四個元素:錯誤代號(error)萄唇、錯誤信息(message)檩帐、錯誤的文件名(file)和錯誤的行號(line)。

?本函數(shù)可以用你自己定義的方式來處理運(yùn)行中的錯誤另萤, 例如湃密,在應(yīng)用程序中嚴(yán)重錯誤發(fā)生時,或者在特定條件下觸發(fā)了一個錯誤(使用?trigger_error())四敞,你需要對數(shù)據(jù)/文件做清理回收泛源。

?? 重要的是要記住?error_types?里指定的錯誤類型都會繞過 PHP 標(biāo)準(zhǔn)錯誤處理程序, 除非回調(diào)函數(shù)返回了?FALSE忿危。error_reporting()設(shè)置將不會起到作用而你的錯誤處理函數(shù)繼續(xù)會被調(diào)用 —— 不過你仍然可以獲取?error_reporting的當(dāng)前值达箍,并做適當(dāng)處理。 需要特別注意的是帶?@ error-control operator前綴的語句發(fā)生錯誤時癌蚁,這個值會是 0幻梯。同時注意,在需要時你有責(zé)任使用?die()努释。 如果錯誤處理程序返回了碘梢,腳本將會繼續(xù)執(zhí)行發(fā)生錯誤的后一行。

?? 以下級別的錯誤不能由用戶定義的函數(shù)來處理:?E_ERROR伐蒂、?E_PARSE煞躬、?E_CORE_ERROR、?E_CORE_WARNING、E_COMPILE_ERROR恩沛、?E_COMPILE_WARNING在扰,和在調(diào)用?set_error_handler()?函數(shù)所在文件中產(chǎn)生的大多數(shù)?E_STRICT。

?? 如果錯誤發(fā)生在腳本執(zhí)行之前(比如文件上傳時)雷客,將不會調(diào)用自定義的錯誤處理程序因?yàn)樗形丛谀菚r注冊芒珠。下面簡單的看一下這個函數(shù)的用法:


/**

*?自定義錯誤處理

*

//set_error_handler(callable?$error_handler?[,?int?$error_types=E_ALL?|?E_STRICT?])

header('Content-type:text/html;charset=utf-8');

function?my_error_id($error,$errmsg,$file,$line){

echo?"錯誤代碼:[{$error}]{$errmsg}"?.?PHP_EOL;

echo?"錯誤行號:{$file}文件下的{$line}行"?.?PHP_EOL;

echo?"PHP版本:"?.?PHP_VERSION?.?"("?.PHP_OS?.?")";

}

set_error_handler('my_error_id',E_ALL&~E_NOTICE);

//設(shè)置出現(xiàn)除了NOTICE以外的錯誤級別時觸發(fā)my_error_id函數(shù)

echo?$error;echo?'';//提醒級別的錯誤

settype($var,'a');//警告級別的錯誤

?>

運(yùn)行的結(jié)果為:

? 當(dāng)然,php還給我們提供了一個取消自定義錯誤處理的回收機(jī)制搅裙,也就是函數(shù)restore_error_handler()皱卓,只有在這個函數(shù)之后的錯誤,都會采用系統(tǒng)內(nèi)置的報錯方法部逮。

注:這里這是大致的演示娜汁,具體的想要怎樣的錯誤處理機(jī)制,自行封裝兄朋。如果想要捕捉E_ERROR的致命錯誤掐禁,單單這個函數(shù)無法做到,因?yàn)橹旅e誤一發(fā)生時颅和,會中止腳本的進(jìn)行傅事,所有,如果想要捕捉融虽,就要用register_shutdown_function函數(shù)來配合使用享完。然而,在PHP7以上有额,E_ERROR的錯誤可以交由set_exception_handler般又,即自定義異常來捕獲。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巍佑,一起剝皮案震驚了整個濱河市茴迁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萤衰,老刑警劉巖堕义,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脆栋,居然都是意外死亡倦卖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門椿争,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怕膛,“玉大人,你說我怎么就攤上這事秦踪『帜恚” “怎么了掸茅?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柠逞。 經(jīng)常有香客問我昧狮,道長,這世上最難降的妖魔是什么板壮? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任逗鸣,我火速辦了婚禮,結(jié)果婚禮上个束,老公的妹妹穿的比我還像新娘慕购。我一直安慰自己,他們只是感情好茬底,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著获洲,像睡著了一般阱表。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贡珊,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天最爬,我揣著相機(jī)與錄音,去河邊找鬼门岔。 笑死爱致,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寒随。 我是一名探鬼主播糠悯,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妻往!你這毒婦竟也來了互艾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤讯泣,失蹤者是張志新(化名)和其女友劉穎纫普,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體好渠,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昨稼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拳锚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假栓。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晌畅,靈堂內(nèi)的尸體忽然破棺而出但指,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布棋凳,位于F島的核電站拦坠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剩岳。R本人自食惡果不足惜贞滨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拍棕。 院中可真熱鬧晓铆,春花似錦、人聲如沸绰播。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠢箩。三九已至链蕊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谬泌,已是汗流浹背滔韵。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掌实,地道東北人陪蜻。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像贱鼻,于是被迫代替她去往敵國和親宴卖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

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

  • 前言:關(guān)于PHP的錯誤和異常我準(zhǔn)備用四大塊來說明忱嘹,內(nèi)容如下: 一嘱腥、錯誤與異常的 區(qū)別 異常一般指非語法和編譯上的錯...
    peanut___閱讀 666評論 1 2
  • 錯誤和異常不是一回事兒:錯誤可能是在開發(fā)階段的一些失誤而引起的程序問題;而異常則是項(xiàng)目在運(yùn)行階段遇到的一些意外拘悦,引...
    樂樂凡凡閱讀 301評論 0 0
  • 請一定要注意齿兔,沒有特殊說明:本例 ****PHP Version < 7說起PHP異常處理,大家首先會想到try-...
    凌亂秋天閱讀 330評論 1 0
  • 開篇一題:問:此腳本執(zhí)行輸出什么础米,如果出現(xiàn)錯誤如何捕獲處理錯誤分苇? 請先思考一下,然后帶著問題來看一下PHP的錯誤與...
    幽思片羽閱讀 569評論 0 0
  • [TOC] 錯誤和異常介紹 Error一般是系統(tǒng)報的(或者通過trigger_error手動拋出錯誤)屁桑,Excep...
    不會打籃球的程序員閱讀 408評論 0 0