先上代碼:
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
var_dump('我是下面程序還沒有運(yùn)行前系統(tǒng)充當(dāng)默認(rèn)的異常處理函數(shù)位他,下面程序在捕捉到了自己的異常后需要恢復(fù)(restore_error_handler)我這個(gè)異常捕捉函數(shù)');
});
/**
* @param callable $errno 必須。錯(cuò)誤級(jí)別绎晃,是一個(gè)integer
* @param string $errstr 必須胶滋。錯(cuò)誤信息,是一個(gè)string
* @param string $errfile 可選。錯(cuò)誤的文件名蹄溉,是一個(gè)string
* @param string $errline 可選。錯(cuò)誤的行號(hào)您炉, 是一個(gè)integer
* @throws Exception 異常對(duì)象
* @return void | boolean 返回值為false柒爵,系統(tǒng)就會(huì)追加異常
*/
function errorHandle($errno, $errstr, $errfile, $errline){
throw new Exception("故意在這里再次拋出異常,然后你用try赚爵,catch就可以接收了".$errstr.$errfile);
}
/**
* @return void
*/
function errorReport(){
set_error_handler('errorHandle');
$a = 0;
$b = 11 / $a;
}
try{
//報(bào)錯(cuò)函數(shù),有時(shí)候程序報(bào)出得錯(cuò)誤 Exception 是捕捉不到的棉胀,try,catch只能捕捉我們程序自己主動(dòng)拋出的錯(cuò)誤冀膝,比如 throw new Exception("我是主動(dòng)拋出的")
//這個(gè)時(shí)候如果我們還想捕捉錯(cuò)誤唁奢,就是本文想要表達(dá)的
//set_error_handler能夠幫助我們捕獲大部分,但其實(shí) set_error_handler 能夠捕捉的錯(cuò)誤也是有限的窝剖,
//如果你想知道實(shí)實(shí)在在的哪些被捕捉了麻掸,哪些可能捕捉不到,這個(gè)時(shí)候你就需要取了解php錯(cuò)誤的類型列表了 @移步 https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html?from=timeline
// 里面請(qǐng)重點(diǎn)關(guān)照 error_reporting(), register_shutdown_function(),set_error_handler(),set_exception_handler()
$a = 1;
if($a == 2){
restore_error_handler(); //該函數(shù)在退出之前我們得恢復(fù)到之前的異常處理機(jī)制赐纱,所以每一處退出行為之前论笔,都得執(zhí)行它
return false;
}
$g = errorReport();
}catch (Exception $e){
restore_error_handler();//這個(gè)是 函數(shù)恢復(fù)之前的錯(cuò)誤處理程序采郎。有時(shí)候我們?cè)诔绦蛑兄皇菫榱吮WC當(dāng)前函數(shù)錯(cuò)誤可控,又不能影響到全局異常狂魔,那么這個(gè)函數(shù)登場(chǎng)了
var_dump($e->getMessage());
}
總結(jié):
1.在php中我們平常用的try,catch只能捕獲我們主動(dòng)拋出的異常蒜埋,當(dāng)然除非你的框架已經(jīng)幫你把異常捕獲處理得能夠通過try,catch去捕獲所有錯(cuò)誤了,那也只能說明你是在框架布好的"局"中在寫代碼.那如果有一天你自己需要寫composer包了呢最楷,是不是得了解點(diǎn)整份,讓包健壯點(diǎn),不然誰該用你的包撒
2.set_error_handler(),能夠幫我們主動(dòng)去捕獲一些異常(這里說的主動(dòng)是你代碼在你不知情的情況下報(bào)錯(cuò)了籽孙,而非throw new Exception 你知道錯(cuò)了手動(dòng)主動(dòng)拋出)烈评,它和restore_error_handler()可打配合。
3.error_reporting(0)犯建,可以讓我們的代碼在執(zhí)行過程中遇錯(cuò)了也不往上拋了讲冠,從而達(dá)到完全全面的接管錯(cuò)誤處理
4.register_shutdown_function(),你語法上的錯(cuò)誤它也能捕獲
5.說來說去适瓦,就是不同的錯(cuò)誤php會(huì)有不同的對(duì)待方式竿开,如果你要結(jié)管,自己管(好處就是你可以自定義對(duì)外輸出格式,從而實(shí)時(shí)讓你的程序可控玻熙,及健壯)否彩,就去要去了解php對(duì)待該種錯(cuò)誤的方式,意思就是有哪個(gè)函數(shù)可以接管該異常情況嗦随。
點(diǎn)擊查看借閱文章