Yaf错误处理与异常捕获

一、异常分类

  • Yaf\Exception_TypeError : 类型错误
  • Yaf\Exception_StartupError : 启动失败
  • Yaf\Exception_DispatchFailed :路由分发失败
  • Yaf\Exception_RouterFailed : 路由失败
  • Yaf\Exception_LoadFailed : 文件加载失败(文件不存在)
  • Yaf\Exception_LoadFailed_Module : 加载模块失败(模块不存在)
  • Yaf\Exception_LoadFailed_Controller : 加载控制器失败(控制器类不存在)
  • Yaf\Exception_LoadFailed_Action : 加载操作失败(方法不存在)
  • Yaf\Exception_LoadFailed_View : 加载模板文件失败(一般是路径不对或后缀问题)

二、错误常量

常量 常量值 备注
YAF\ERR\STARTUP_FAILED 512 启动失败
YAF\ERR\ROUTE_FAILED 513 路由失败
YAF\ERR\DISPATCH_FAILED 514 路由分发失败
YAF\ERR\AUTOLOAD_FAILED 520 自动加载失败
YAF\ERR\NOTFOUND\MODULE 515 加载模块失败
YAF\ERR\NOTFOUND\CONTROLLER 516 加载控制器失败
YAF\ERR\NOTFOUND\ACTION 517 加载方法失败
YAF\ERR\NOTFOUND\VIEW 518 加载模板失败
YAF\ERR\CALL_FAILED 519 调用方法失败
YAF\ERR\TYPE_ERROR 521 类型错误

注:在不启用命名空间时,请将\换成_

在捕获异常与错误时,可以通过$e->getCode()来获取错误号,如ErrorController控制器捕获

  1. class ErrorController extends Yaf\Controller_Abstract
  2. {
  3. /**
  4. * 也可通过$request->getException()获取到发生的异常
  5. */
  6. public function errorAction($exception)
  7. {
  8. $constArr = array(
  9. YAF\ERR\NOTFOUND\MODULE,
  10. YAF\ERR\NOTFOUND\CONTROLLER,
  11. YAF\ERR\DISPATCH_FAILED,
  12. YAF\ERR\NOTFOUND\ACTION,
  13. YAF\ERR\NOTFOUND\VIEW
  14. );
  15. $err = $exception->getCode();
  16. if (in_array($err, $constArr)) {
  17. $code = 404;
  18. $message = '请求的页面不存在';
  19. } else {
  20. $code = 500;
  21. $message = '服务器在偷懒';
  22. }
  23. if (ENV == 'DEV') {
  24. $message = $exception->getMessage();
  25. }
  26. //记录到日志或显示到页面上
  27. }
  28. }

三、异常捕获与处理

1、使用ErrorController控制器来处理

前提:打开Dispatcher的捕获异常的设置

在Bootstrap.php中添加:

  1. /**
  2. * 初始化路由
  3. */
  4. public function _initRoute()
  5. {
  6. \Yaf\Dispatcher::getInstance()->catchException(true);
  7. }

具体请查看:yaf控制器那一节的错误控制器

2、使用Dispatcher的setErrorHandler方法来捕获
(1)前提是关闭Dispatcher抛出异常的功能(这个可以与第三步一起)
(2)定义异常处理函数,一般在Bootstrap.php中定义(或者在Bootstrap.php加载前定义一个函数)
  1. function appErrorHandler($errno, $errmsg, $errFile, $errLine, $app)
  2. {
  3. //写入日志(这些错误信息可以通过传入的参数$errno, $errmsg等来获取)
  4. //var_dump($app['app']->getDispatcher()->getRequest()->module);(通过$app['app']可以获取当前应用的信息,比如当前请求的模块名等)
  5. //显示错误(可以通过美化的模板来显示)
  6. }

参数说明:

  • $errno:错误号
  • $errmsg:错误信息
  • $errFile:出现错误的文件
  • $errLine:出现错误的行数
  • $app:应用相关的信息(比如应用配置等)

如果我并不知道appErrorHandler有哪些参数,即出现错误时,不知道传给回调函数appErrorHandler的参数有哪些,该咋办呢,PHP有一个好用的函数 func_get_args()可以获取当前函数的参数

  1. function appErrorHandler()
  2. {
  3. var_dump(func_get_args());
  4. }
(3)在入口文件中设置错误捕获函数
  1. <?php
  2. define("APP_PATH", realpath(dirname(__FILE__) . '/../')); //应用目录
  3. \Yaf\Loader::import(APP_PATH.'/application/init.php');
  4. $app = new \Yaf\Application(APP_PATH . "/conf/application.ini");
  5. $app->getDispatcher()->throwException(FALSE)->setErrorHandler('appErrorHandler', E_ALL ^E_NOTICE);
  6. $app->bootstrap()->run();
  • 注:在项目中定义了一个init.php的初始化程序文件,主要用来定义项目常量,以及错误处理函数appErrorHandler