-
**开启异常捕获:**YAF框架配置文件
conf/application.ini
中设置application.dispatcher.catchException =1
-
当使用
Yaf
框架搭建应用时,可以在ErrorController
类中编写捕捉异常的代码逻辑。在该类中,可以通过重写
errorAction()
方法来处理异常情况。以下是一个示例,展示了如何在ErrorController
类中编写捕捉异常的代码逻辑:
class ErrorController extends Yaf_Controller_Abstract
{
/**
* 通过$request->getException()获取到发生的异常
*/
public function errorAction($exception)
{
$code = $exception->getCode();
$message = $exception->getMessage();
$file = $exception->getFile(); // 报错文件
$line = $exception->getLine(); // 文件报错位置的行号
$trace = $exception->getTrace(); // 报错信息,数组格式
$traceAsString = $exception->getTraceAsString(); // 报错信息字符串
$err_msg = '';
switch ($code) {
case YAF_ERR_DISPATCH_FAILED:
// 514- 将请求分发到指定的控制器或方法时 分发失败
$err_msg = '分发失败';
break;
case YAF_ERR_NOTFOUND_MODULE:
// 515 - 当找不到请求的模块时抛出的错误。
$err_msg = '请求模块不存在';
break;
case YAF_ERR_NOTFOUND_CONTROLLER:
// 516 - 当找不到请求的控制器时抛出的错误。
$err_msg = '请求控制器不存在';
break;
case YAF_ERR_NOTFOUND_ACTION:
// 517 - 当找不到请求的方法时抛出的错误
$err_msg = '请求控制器下方法不存在';
break;
case YAF_ERR_NOTFOUND_VIEW:
// 518 - 当找不到请求的视图文件时抛出的错误
$err_msg = '视图文件不存在';
break;
case YAF_ERR_STARTUP_FAILED:
// 512 - 在启动YAF应用程序时发生了错误,可能由于初始化配置或资源失败导致的问题
$err_msg = '应用程序启动失败,请检查初始化配置以及加载资源';
break;
case YAF_ERR_ROUTE_FAILED:
// 513 在路由过程中出现了错误,可能是由于没有匹配到对应的路由规则,或者路由规则配置不正确等情况
$err_msg = '路由错误,请检查相关配置';
break;
case YAF_ERR_CALL_FAILED:
// 519 - 在调用控制器或操作方法时发生了错误。这可能是由于调用的控制器或操作方法不存在、参数不正确或其他异常情况导致的.
$err_msg = '控制器或方法调用异常';
break;
case YAF_ERR_AUTOLOAD_FAILED:
// 520 - 在自动加载类文件时出现了错误,可能是由于类文件不存在、命名空间不正确或其他加载问题导致的
$err_msg = '自动加载类文件失败,请检查文件路径或命名空间';
break;
case YAF_ERR_TYPE_ERROR:
// 521 - 在函数或方法中传递了错误类型的参数
$err_msg = '函数或方法参数错误';
break;
default:
$err_msg = '未捕捉异常';
}
$request_uri = $_SERVER['REQUEST_URI']; // 请求地址不带域名
$log = "[" . date('Y-m-d H:i:s') . "]\r\n";
$log .= "请求地址: " . $_SERVER['REQUEST_URI'] . "\r\n";
$log .= "请求参数:" . http_build_query($_REQUEST) . "\r\n";
$log .= "报错内容: {$err_msg}\r\n";
$log .= "错误码: " . $code . "\r\n";
$log .= "错误信息: " . $message . "\r\n";
$log .= "报错文件: " . $file . "\r\n";
$log .= "报错行号: " . $line . "\r\n";
$log .= "Trace: \r\n" . $traceAsString . "\r\n\r\n";
// 过滤不需要记录报错的请求地址
$filter_url_arr = [
'/api/user/demo',
];
if (!in_array($request_uri, $filter_url_arr)) {
$log_file = APP_PATH . '/logs/error/error_' . date('Ymd') . '.txt';
file_put_contents($log_file, $log, FILE_APPEND);
}
$data = [
'code' => 0,
'msg' => 'error',
'data' => [
'code' => $code,
'err_msg' => $err_msg,
'message' => $message,
'file' => $file,
'line' => $line,
'trace' => $trace,
'getTraceAsString' => $traceAsString
]
];
echo json_encode($data);
die;
}
}
在上面的示例中,errorAction()
方法首先获取传递给错误控制器的异常对象和错误代码。然后,它检查异常对象的类型,如果是 Exception
类的实例,表示出现了未捕获的异常。在这种情况下,可以执行自定义的异常处理逻辑,例如记录日志或向用户显示友好的错误信息。
- 捕获应用程序中未被框架捕获的异常
文件: app/Bootstrap.php
/**
* 初始化错误处理函数
* @param Yaf_Dispatcher $dispatcher
*/
public function _initErrorHandle(Yaf_Dispatcher $dispatcher)
{
// 设置调度器的错误处理函数
$dispatcher->setErrorHandler(array(get_class($this),'customErrorHandler'), E_ALL);
}
/**
* 自定义异常捕获函数
* @param $errno - 报错级别
* @param $errstr - 报错内容
* @param $errfile - 报错文件
* @param $errline - 报错文件行号
* @return false
*/
public function customErrorHandler($errno, $errstr, $errfile, $errline)
{
// 抛出异常
throw new ErrorException($errstr, 50001, $errno, $errfile, $errline);
// 继续执行默认的错误处理机制
return false;
}