【问题标题】:Handle global exceptions in phalcon在 phalcon 中处理全局异常
【发布时间】:2016-03-01 13:40:02
【问题描述】:

我想知道,在 Phalcon 中处理异常的最佳方法是什么?我想为发生错误时创建一个默认错误页面。所以我将/app/public/index.html 重写为:

<?php

error_reporting(E_ALL);

try {
    /**
     * Define some useful constants
     */
    define('BASE_DIR', dirname(__DIR__));
    define('APP_DIR', BASE_DIR . '/app');

    require_once __DIR__ . '/../vendor/autoload.php';


    /**
     * Read the configuration
     */
    $config = include APP_DIR . '/config/config.php';

    /**
     * Read auto-loader
     */
    include APP_DIR . '/config/loader.php';

    /**
     * Read services
     */
    include APP_DIR . '/config/services.php';

    /**
     * Handle the request
     */
    $application = new \Phalcon\Mvc\Application($di);

    echo $application->handle()->getContent();
} catch (Exception $e) {
    echo 'This is where I want my handling to be';
}

但是,当出现错误时,我不断收到默认的 Chrome 500 错误窗口。该错误被记录到 OS X 的错误控制台,但我没有看到我的回声。我做错了什么?

【问题讨论】:

  • 这是引导您的应用程序并捕获异常的正确方法。 您想捕捉什么样的错误? 例如,如果您将数据库密码更改为不正确的密码,您的代码将正常工作。但是如果你犯了一个解析错误,它就不会被捕获。

标签: php phalcon


【解决方案1】:

在 app/config/service.php 中

use \Phalcon\Mvc\Dispatcher as PhDispatcher;

.
.
.


$di->set(
'dispatcher',
function() use ($di) {

    $evManager = $di->getShared('eventsManager');

    $evManager->attach(
        "dispatch:beforeException",
        function($event, $dispatcher, $exception)
        {
            switch ($exception->getCode()) {
                case PhDispatcher::EXCEPTION_HANDLER_NOT_FOUND:
                case PhDispatcher::EXCEPTION_ACTION_NOT_FOUND:

                    $dispatcher->forward(
                        array(
                            'namespace' => 'App\Controllers\Web',
                            'controller' => 'error',
                            'action'     => 'show404',
                        )
                    );
                    return false;
            }
        }
    );
    $dispatcher = new PhDispatcher();
    $dispatcher->setEventsManager($evManager);
    return $dispatcher;
},
true

);

【讨论】:

    【解决方案2】:

    使用多个 catch 块而不是只使用 \Exception 添加特定类型的异常,例如 \PDOException

    try
    {
     /* something */
    }
    catch(\Exception $e )
    {
       handler1( $e );
    }
    catch ( \PDOException $b )
    {
       handler2( $e );
    }
    // add more ex here
    

    您说“发生错误时”,如果您想处理错误,请在 Phalcon 引导程序 (public/index.php) 文件的顶部添加错误处理程序。

    function handleError($errno, $errstr) {
        echo "<b>Error:</b> [$errno] $errstr<br>";
        //do what ever
        die();
    }
    set_error_handler("handleError");
    

    【讨论】:

      【解决方案3】:

      如果您想显示 PHP 解析错误,您需要在 PHP.ini 文件中更改这一行:

      display_errors = on
      

      您可能需要重新启动网络服务器才能使此更改生效。


      如果不确定ini文件的位置,输出以下代码行:

      <?php phpinfo(INFO_GENERAL) ?>
      

      这应该会显示 PHP.ini 文件的位置


      另一方面。像这样抓住你的错误不是一个好习惯。 Phalcon 提供了不同的方法来捕获错误。

      $eventsManager->attach('dispatch:beforeException', new NotFoundPlugin);
      

      完整示例请参阅the Phalcon INVO repository

      【讨论】:

        猜你喜欢
        • 2016-11-03
        • 2015-08-09
        • 1970-01-01
        • 2015-12-21
        • 2011-09-29
        • 2011-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多