【问题标题】:Where to catch exception in PHP MVC application?在 PHP MVC 应用程序中在哪里捕获异常?
【发布时间】:2015-09-25 00:26:51
【问题描述】:

我有为练习 OOP 和 MVC 技能而构建的中小型 PHP 应用程序。我有 init/bootstrap 文件调用 Router 调用 Controller -> Service Layer -> Repository (数据库),然后将变量发送回 View Layer(所有依赖项都由 DiC/IOC 处理)。

我创建了 abstract class BaseException,它扩展了 Core Exception 类。然后我有不同的异常类——DatabaseException、FileException 等。

触发异常的示例:在数据库层中,我尝试从数据库中获取数据,如果失败则抛出新的 DatabaseException。

示例 2: 在我处理文件的类中包含、保存、删除 - 如果发生错误,它会抛出新的 FileException。

try catch 代码放在哪里,在 init/bootstrap 文件中还是在 BaseController 中?但是如果 Controller 失败并抛出某种 ControllerException 怎么办。

在我看来,它可能看起来像这样(init.php 文件):

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 类并在那里处理日志记录?

【问题讨论】:

    标签: php exception logging exception-handling


    【解决方案1】:

    与普通 php 一样,您可以在任何需要的地方实现 try/catch。

    在我的项目中(作为 MVC 框架用户),我通常在我的控制器方法中处理异常,因为它们有责任处理应用程序中的进程。但如果需要,我会在中间件中实现它,如果我愿意的话,甚至可以在模型中实现。

    在您的情况下,您似乎希望让您的框架在将异常输出到用户界面之前对其进行处理,就像 Laravel(还有许多其他人)所做的那样。

    您可以使用 PHP 中的 set_exception_handler() 函数来完成此操作。

    以下是基于docs 示例的示例:

    set_exception_handler(function($exception){
    
        //you could write in a log file here for example...
        echo "Uncaught exception: " , $exception->getMessage(), "\n";
    
    });
    

    【讨论】:

    • 谢谢,我已经为未处理/捕获的异常和错误打开了 set_error_handler()、set_exception_handler() 和 register_shutdown_function()。对于其他所有事情,如果有正确的方法而不是致命错误,我会尝试在发生错误的地方捕获它们,然后尝试从中恢复。
    • 这实际上如何与扩展 Exception 类一起工作?你还在使用带有这个异常处理程序的扩展类吗?另外,你究竟会在哪里调用 log 函数,因为如果你捕获异常,这个异常处理程序类将不会运行
    猜你喜欢
    • 2013-02-26
    • 2011-01-16
    • 2011-03-07
    • 1970-01-01
    • 2018-04-03
    • 2011-05-12
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多