简单的异常捕获
<?php #应用类
namespace Home\Controller;
class TestController{
function a(){
try{
throw new \Exception('异常');
}catch (\Exception $exception){
echo $exception->getMessage(); #异常
}
}
}
如果类中有20个方法,每个都try_catch?
可以写个基类,在基类的构造函数里注册一个异常处理函数,其他的类继承这个基类
<?php #基类
namespace Home\Controller;
class MyController{
public function __construct () {
//set_exception_handler() 接收一个callable
set_exception_handler(
function (\Throwable $exception){
echo $exception->getMessage();
}
);
}
}
继承基类,所有的异常都会抛出给基类,基类可以做统一处理.
<?php #应用类
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('数据库异常'); #数据库异常
}
function d(){
set_time_limit(1);
while(true){}
}
function e(){
ini_set('memory_limit','10M');
while (true){
$data[] = 1;
}
}
}
注意最后两个方法
function d()
报错超时
function e()
报错内存溢出
并不能被基类捕获
可以注册一个register_shutdown_function()
,该方法在脚本结束时执行.
#index.php 入口文件
register_shutdown_function(
function (){
$error = error_get_last();
if ($error){
dump($error);
}
}
);
要注意的是,这个函数可以出现多次,并按注册先后顺序执行,前边的执行了exit(); 后续的将不会执行.有的框架如tp3.2.3已经注册了此方法,并且他内部执行了exit(); 想让自己的方法执行,应该早于框架注册, 可以放在index.php文件中,这样便能处理超时和内存溢出错误
网友评论