(1).今天遇到一件奇怪的事情,在event事件中是无法自定义异常处理,例如我们使用set_exception_handler来统一处理异常。例如下面的代码:
<?php error_reporting(E_ALL); set_error_handler(function ($errno, $errStr, $errFile, $errLine){ var_dump($errno, $errStr, $errFile, $errLine); }); set_exception_handler(function ($exception){ var_dump($exception->getMessage()); }); function aa() { a(); } //创建event配置.[空配置] $eventConfig = new EventConfig(); //创建eventBase对象.event的所有基础类 $eventBase = new EventBase($eventConfig); //创建event事件 $event = new Event($eventBase,-1,Event::TIMEOUT | Event::PERSIST,function(){ echo 'date:'.date('Y-m-d H:i:s').PHP_EOL; aa(); }); //将创建的event事件扔到eventBase中,并设置超时时间为0.5秒 $event->add(2); //让eventBase对象开始进入事件循环 $eventBase->loop();
我本来以为掉用不存在的a方法应该会触发set_exception_handler方法捕捉到。事实上上面的代码运行后不会报错,并且输出一次日期后就阻塞了。
(2).实际上event和swoole是一样的,运行以后会接管系统控制权,在其内部已经存在一个大的try catch,已经将异常捕获到了,捕获到异常的event还不打算退出进程,并且event扩展不继续把异常向上抛,这就导致了程序依然在阻塞,但是并不执行。我们来验证这件事情。例如我们是无法捕获整个event异常的
<?php function aa() { a(); } try { //创建event配置.[空配置] $eventConfig = new EventConfig(); //创建eventBase对象.event的所有基础类 $eventBase = new EventBase($eventConfig); //创建event事件 $event = new Event($eventBase,-1,Event::TIMEOUT | Event::PERSIST,function(){ echo 'date:'.date('Y-m-d H:i:s').PHP_EOL; aa(); }); //将创建的event事件扔到eventBase中,并设置超时时间为0.5秒 $event->add(2); //让eventBase对象开始进入事件循环 $eventBase->loop(); } catch (Throwable $exception) { var_dump($exception->getMessage()); }
(3).既然对event整体没有办法捕捉异常,那我们可以对其执行的代码做异常啊,毕竟是先实例化的event,例如下面的代码成功捕获异常
<?php function aa() { a(); } //创建event配置.[空配置] $eventConfig = new EventConfig(); //创建eventBase对象.event的所有基础类 $eventBase = new EventBase($eventConfig); //创建event事件 $event = new Event($eventBase, -1, Event::TIMEOUT | Event::PERSIST, function () { echo 'date:' . date('Y-m-d H:i:s') . PHP_EOL; try { aa(); } catch (Throwable $exception) { var_dump($exception->getMessage()); } }); //将创建的event事件扔到eventBase中,并设置超时时间为0.5秒 $event->add(2); //让eventBase对象开始进入事件循环 $eventBase->loop();