Исключения в PHP - Try / Catch или set_exception_handler? - PullRequest
17 голосов
/ 17 февраля 2009

Я разрабатываю некоторый нижний код в моей системе, который использует несколько дочерних классов класса исключений php. По сути, у меня есть исключения, разбитые на несколько категорий. То, что я хочу сделать, это две вещи.

  1. Мне нужно, чтобы все исключения, которые запускаются в приложении, обрабатывались в одном месте.
  2. Мне нужно иметь возможность войти, а затем обработать / сгенерировать представление для пользователя, чтобы получать отзывы о приложениях. ошибка.

Что мне интересно, так это то, что я должен иметь какую-то попытку / поймать инкапсулирующую приложение? Мне вообще не нравится эта идея, она звучит как очень дурацкая реализация. Мне также не нравится идея set_exception_handler, если я не могу установить функцию как метод объекта. Причина этого в том, что если я назначу функцию для обработки исключений, это будет первая функция в приложении. Все остальное - это метод объекта.

Надеюсь, я предоставил достаточно подробностей о сценарии. Я стараюсь держать это в чистоте и следовать лучшим практикам. Этот код будет работать OSS, поэтому мне не хочется писать его 10 раз:)

Ответы [ 3 ]

23 голосов
/ 17 февраля 2009
  1. Выполните ваши веб-запросы через скрипт Front Controller
  2. вызов set_exception_handler в начале выполнения (не забудьте учесть error_reporting()). set_exception_handler принимает в качестве параметра то, что php называет "обратным вызовом" . Вы можете передать объектный метод так:

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
  3. Оберните ваш диспетчерский код с помощью try/catch, чтобы поймать любой код, который ВЫБРАВАЕТ исключения. Часть catch вашего кода будет перехватывать все ваши собственные исключения кодов, а также некоторые php-ошибки, которые не генерировали исключение изначально (например, fopen или что-то в этом роде) благодаря вашему вызову set_exception_handler выше , Руководство php гласит:

    Следующие типы ошибок не могут быть обрабатывается пользовательской функцией: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING и большинство E_STRICT поднял в файле, где set_error_handler () вызывается.

  4. При необходимости регистрируйте ошибки.

  5. Создайте шаблон страницы ошибок («Представление»), который работает с объектом Exception («Модель») и довольно печатает весь след стека для вас в процессе разработки. Создайте другой шаблон, который идет в производство. Ветка в вашей среде, например:

    catch(Exception $e) {
        // log error as necessary here.
        if("in developement") {
            // $e would be available to your template at this point
            include "errortemplates/dev.php";
        } else {
            include "errortemplates/prod.php";
        }
    }
    
11 голосов
/ 17 февраля 2009

Более подробная информация о "обратных вызовах" PHP здесь . Чтобы использовать статический метод, обратный вызов - это что-то вроде

<?php
set_exception_handler(array('MyClass','staticMethod'));
?>

Чтобы использовать метод из экземпляра объекта, это:

<?php
set_exception_handler(array($myObject, 'objectMethod'));
?>

А чтобы использовать глобальную функцию, просто:

<?php
set_exception_handler('my_global_function');
?>
4 голосов
/ 17 февраля 2009

Судя по звучанию, вы будете использовать set_exception_handler. Это гарантирует, что все исключения обрабатываются одинаково. В вашем приложении есть места для использования блоков try / catch, например, если вы хотите проверить наличие единственного исключения, которое не обязательно должно быть перехвачено таким же образом.

Что касается установки set_exception_handler, я не уверен, что вы можете установить функцию как метод объекта, если он не является статическим методом. Похоже, что это так. Больше информации на http://us2.php.net/set_exception_handler

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