我有一个中小型 PHP 应用程序,用于练习 OOP 和 MVC 技能。我有初始化/引导程序调用的文件Router谁打电话控制器 -> 服务层 -> 存储库(数据库)然后将变量发送回视图层(所有依赖项均由 DiC/IOC 处理)。
我创建抽象类 BaseException扩展核心例外班级。然后我有不同的异常类 - DatabaseException、FileException 等。
触发异常的示例:在数据库层中,我尝试从数据库中获取数据,如果失败,则会抛出新的DatabaseException。
示例2:在我处理文件包含、保存、删除的类中 - 如果发生错误,它会抛出新的 FileException。
将 try catch 代码放在哪里,在 init/bootstrap 文件中还是在 BaseController 中?但是如果 Controller 失败并抛出某种 ControllerException 该怎么办?
在我看来,它可能看起来像这样(init.php file):
try {
// create new router
$router = $container->get('Router');
$router->import'Config/routes.php');
// run the router
$router->route();
// load controller
$dispatcher = $container->get('Dispatcher');
$dispatcher->load();
} catch (DatabaseException $e) {
echo "Database error!";
$log->log('Database error', $e->getMessage());
} catch (FileException $e) {
echo "File error!";
$log->log('File error', $e->getMessage());
} catch (Exception $e) { // default
echo "Some exceptional error!";
$log->log('Default exception', $e->getMessage());
}
还有一个问题,如何记录这些异常(错误),如上面的示例,或者我应该在 BaseException 中注入 Log 类并在那里处理日志记录?
Edit:
在 Laravel 较新版本中,应用程序错误在中处理App\Exceptions\Handler
class.
原答案:
与普通 php 一样,您可以在任何需要的地方实现 try/catch。
在我的项目中(作为 MVC 框架用户),我通常在控制器方法中处理异常,因为它们有责任处理应用程序中的进程。但如果需要,我会在中间件中实现它,甚至在模型中(如果我愿意的话)。
在你的例子中,你似乎想让你的框架在将异常输出到用户界面之前处理异常,就像 Laravel (还有许多其他框架)所做的那样。
你可以通过以下方式完成此操作set_exception_handler()
来自 PHP 的函数。
这是一个基于的示例docs http://php.net/manual/pt_BR/function.set-exception-handler.php例子:
set_exception_handler(function($exception){
//you could write in a log file here for example...
echo "Uncaught exception: " , $exception->getMessage(), "\n";
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)