如何禁用所有异常以启用phalcons调试?

时间:2014-11-17 10:30:32

标签: debugging phalcon

我想使用phalcon的内部调试组件:

http://docs.phalconphp.com/en/latest/reference/debug.html#debug-component

<?php

$debug = new \Phalcon\Debug();
$debug->listen();

在那里写道:

  

必须删除或禁用任何Try / Catch块才能使此组件正常工作。

到目前为止一切顺利,但如何在项目中禁用全局所有异常。目前我没有找到任何解决方案,也许有可能配置phalcon或调试组件。

一些想法?即使你告诉我你没有使用该组件。

1 个答案:

答案 0 :(得分:0)

当我们尝试在应用程序中实现集中式异常处理时,这是一个微不足道的问题。

您应该定义应用程序的异常类型,并使它们来自同一个基类。就像所有来自Exception的PHP异常和来自Phalcon\Exception的Phalcon异常一样,您应该拥有自己的异常基类,这样您就可以立即更改其行为,更重要的是不要复制在您的代码中尝试/捕获语句。

如果该项目在任何地方都有try / catch语句,我建议您重构异常。如果决定这样做,请查看this library。它非常易于使用并支持Phalcon。


修改

是的,我有你试图禁用你的异常(直接把它们扔给Phalcon \ Debug吧?)而不是集中处理它们。但是通过对我的所有例外进行细分,我可以立即控制他们的行为。例如,在我正在处理的应用程序中,我在基本异常的构造函数中放置了断点,因为它是much more useful而非异常消息。以下是目前的情况:

<?php
namespace MyApp\Exceptions;

use Exception as RawException;
use LogicException;
use Phalcon\Exception as PhException;

abstract class ExceptionBase extends PhException
{
    const CODE_UNKNOWN = 1;

    /** @var bool Set it to true to see what is going on before the server explodes */
    public static $holdYourHorses = false;

    /** @var bool Internal flag used to assert that constructor chain was called correctly */
    private $baseConstructorCalled = false;

    /**
     * Base constructor for all managed exceptions.
     * @param string $message
     * @param int $code
     * @param \Exception|null $previous
     */
    public function __construct($message = "", $code = self::CODE_UNKNOWN, RawException $previous = null)
    {
        if(self::$holdYourHorses) {
            // In this block we might put some dummy variables with useful values...
            // like the requested URI or the amount of memory currently in use
            if(function_exists('xdebug_break')) {
                xdebug_break();
            }
        }

        $this->baseConstructorCalled = true;
        parent::__construct($message, $code, $previous);
    }

    /**
     * This assertion should be called by the main exception handler if the application is NOT running in production.
     * @throws \LogicException
     */
    public function assertConstructionChain()
    {
        if(!$this->baseConstructorCalled) {
            $nastyBoy = get_class($this);
            throw new LogicException("Please ensure that the constructor chain of $nastyBoy is implemented properly!");
        }
    }
}