Исключения в 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