Отправить необработанные исключения для конкретного метода - PullRequest
1 голос
/ 11 февраля 2011

У меня есть пользовательский класс исключений с методом show (), который красиво показывает исключения.
В некоторых фатальных ошибках я оставил исключения необработанными, чтобы программы существовали промежуточно, но я бы хотел, чтобы эти исключения отображалисьс помощью метода show.
Можно ли это сделать?

class MyException extends Exception
{
    public $e;
    public function _contruct($message, $code = 0)
    {
        parent::_construct($message, $code);
    }

    public function show()
    {
        if(!defined('DEBUG')) define('DEBUG', FALSE);
        p("Error: " . $this->getMessage());
        if(DEBUG)
        {
            p('Stack trace');
            p($this->getFile() . ' (' . $this->getLine() . ')');
            pre(get_dump($this->getTraceAsString()));
        }
    }
}

Решение

class MyException extends Exception
{
    public $e;
    public function _contruct($message, $code = 0)
    {
        parent::_construct($message, $code);
    }

    public function show()
    {
        MyException::realShow($this);
    }

    static function realShow($e)
    {
        if(!defined('DEBUG')) define('DEBUG', FALSE);
        p("Error: " . $e->getMessage());
        if(DEBUG)
        {
            p('Stack trace');
            p($e->getFile() . ' (' . $e->getLine() . ')');
            pre(get_dump($e->getTraceAsString()));
        }
    }
}

Если у кого-то есть способ получше, я весь в глазах.

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Конечно, вы можете установить функцию обработчика необработанных исключений, используя функцию set_exception_handler:

function exception_handler($ex) {
   //$ex will be the thrown Exception object
}

set_exception_handler('exception_handler');

Из документов:

Устанавливает обработчик исключений по умолчанию, если исключение не перехвачено в блоке try / catch. Выполнение будет остановлено после того, как обработчик exception_handler вызван

Кроме того, вам не нужно переопределять конструктор, конструктор родительского класса будет вызываться автоматически, если он не переопределен.

0 голосов
/ 11 февраля 2011

Вы не должны использовать систему исключений в PHP.

Как указано в документации:

Система исключений PHP вызывает определенные накладные расходы на объект еще до того, как они были выброшены. Это требует тщательной обработки памяти и рекомендуется только для критических системных исключений (неуправляемых вами или пользователем). Для более распространенных вещей лучше использовать trigger_error на пользовательских объектах, не являющихся исключениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...