一、异常分类
- 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控制器捕获
class ErrorController extends Yaf\Controller_Abstract
{
/**
* 也可通过$request->getException()获取到发生的异常
*/
public function errorAction($exception)
{
$constArr = array(
YAF\ERR\NOTFOUND\MODULE,
YAF\ERR\NOTFOUND\CONTROLLER,
YAF\ERR\DISPATCH_FAILED,
YAF\ERR\NOTFOUND\ACTION,
YAF\ERR\NOTFOUND\VIEW
);
$err = $exception->getCode();
if (in_array($err, $constArr)) {
$code = 404;
$message = '请求的页面不存在';
} else {
$code = 500;
$message = '服务器在偷懒';
}
if (ENV == 'DEV') {
$message = $exception->getMessage();
}
//记录到日志或显示到页面上
}
}
三、异常捕获与处理
1、使用ErrorController控制器来处理
前提:打开Dispatcher的捕获异常的设置
在Bootstrap.php中添加:
/**
* 初始化路由
*/
public function _initRoute()
{
\Yaf\Dispatcher::getInstance()->catchException(true);
}
具体请查看:yaf控制器那一节的错误控制器
2、使用Dispatcher的setErrorHandler方法来捕获
(1)前提是关闭Dispatcher抛出异常的功能(这个可以与第三步一起)
(2)定义异常处理函数,一般在Bootstrap.php中定义(或者在Bootstrap.php加载前定义一个函数)
function appErrorHandler($errno, $errmsg, $errFile, $errLine, $app)
{
//写入日志(这些错误信息可以通过传入的参数$errno, $errmsg等来获取)
//var_dump($app['app']->getDispatcher()->getRequest()->module);(通过$app['app']可以获取当前应用的信息,比如当前请求的模块名等)
//显示错误(可以通过美化的模板来显示)
}
参数说明:
- $errno:错误号
- $errmsg:错误信息
- $errFile:出现错误的文件
- $errLine:出现错误的行数
- $app:应用相关的信息(比如应用配置等)
如果我并不知道appErrorHandler有哪些参数,即出现错误时,不知道传给回调函数appErrorHandler的参数有哪些,该咋办呢,PHP有一个好用的函数 func_get_args()可以获取当前函数的参数
function appErrorHandler()
{
var_dump(func_get_args());
}
(3)在入口文件中设置错误捕获函数
<?php
define("APP_PATH", realpath(dirname(__FILE__) . '/../')); //应用目录
\Yaf\Loader::import(APP_PATH.'/application/init.php');
$app = new \Yaf\Application(APP_PATH . "/conf/application.ini");
$app->getDispatcher()->throwException(FALSE)->setErrorHandler('appErrorHandler', E_ALL ^E_NOTICE);
$app->bootstrap()->run();
- 注:在项目中定义了一个init.php的初始化程序文件,主要用来定义项目常量,以及错误处理函数appErrorHandler