代码之家  ›  专栏  ›  技术社区  ›  user4992124

处理phalcon中的全局异常

  •  4
  • user4992124  · 技术社区  · 8 年前

    我想知道,在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错误窗口。错误被记录到OSX的错误控制台,但我没有看到我的回声。我做错了什么?

    3 回复  |  直到 8 年前
        1
  •  3
  •   M Ashraful A    8 年前

    使用多个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");
    
        2
  •  1
  •   Ali SadeghipourKorabaslo    8 年前

    在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
    

    );

        3
  •  0
  •   Timothy Justin T.    8 年前

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

    display_errors = on
    

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


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

    <?php phpinfo(INFO_GENERAL) ?>
    

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


    另一方面。像那样抓住你的错误不是一种好的做法。Phalcon提供了不同的方法来捕获错误。

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

    提到 the Phalcon INVO repository 完整示例。