Исключения в PHP - Try/Catch или set_exception_handler?

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

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

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

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

Ответы

Ответ 1

  • Запустите веб-запросы с помощью Front Controller script
  • вызовите set_exception_handler в начале выполнения (не забудьте указать error_reporting()). set_exception_handler принимает в качестве своего параметра то, что php вызывает "callback" . Вы можете передать объектный метод следующим образом:

    // $object->methodName() will be called on errors
    set_exception_handler(array($object, 'methodName'));
    
  • Оберните свой диспетчерский код с помощью try/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().

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

  • Создайте шаблон страницы с ошибкой ( "Вид" ), который работает с объектом 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";
        }
    }
    

Ответ 2

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

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

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

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

И для использования глобальной функции это просто:

<?php
set_exception_handler('my_global_function');
?>

Ответ 3

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

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