簡單的異常捕獲
<?php #應(yīng)用類
namespace Home\Controller;
class TestController{
function a(){
try{
throw new \Exception('異常');
}catch (\Exception $exception){
echo $exception->getMessage(); #異常
}
}
}
如果類中有20個方法,每個都try_catch?
可以寫個基類,在基類的構(gòu)造函數(shù)里注冊一個異常處理函數(shù),其他的類繼承這個基類
<?php #基類
namespace Home\Controller;
class MyController{
public function __construct () {
//set_exception_handler() 接收一個callable
set_exception_handler(
function (\Throwable $exception){
echo $exception->getMessage();
}
);
}
}
繼承基類,所有的異常都會拋出給基類,基類可以做統(tǒng)一處理.
<?php #應(yīng)用類
namespace Home\Controller;
class TestController extends MyController {
function a(){
throw new \Exception('異常aaa');#異常aaa
}
function b(){
throw new \Exception('異常bbb');#異常bbb
}
function c(){
throw new \mysqli_sql_exception('數(shù)據(jù)庫異常'); #數(shù)據(jù)庫異常
}
function d(){
set_time_limit(1);
while(true){}
}
function e(){
ini_set('memory_limit','10M');
while (true){
$data[] = 1;
}
}
}
注意最后兩個方法
function d()報錯超時
function e()報錯內(nèi)存溢出
并不能被基類捕獲
可以注冊一個register_shutdown_function(),該方法在腳本結(jié)束時執(zhí)行.
#index.php 入口文件
register_shutdown_function(
function (){
$error = error_get_last();
if ($error){
dump($error);
}
}
);
要注意的是,這個函數(shù)可以出現(xiàn)多次,并按注冊先后順序執(zhí)行,前邊的執(zhí)行了exit(); 后續(xù)的將不會執(zhí)行.有的框架如tp3.2.3已經(jīng)注冊了此方法,并且他內(nèi)部執(zhí)行了exit(); 想讓自己的方法執(zhí)行,應(yīng)該早于框架注冊, 可以放在index.php文件中,這樣便能處理超時和內(nèi)存溢出錯誤