Я разрабатываю код нижнего кода в моей системе, который использует несколько дочерних классов класса исключений php. По сути, у меня есть исключения, разбитые на несколько категорий. То, что я хочу сделать, это две вещи.
Мне интересно, должен ли я иметь какую-то попытку / уловку, инкапсулирующую приложение? Мне совсем не нравится эта идея, это звучит как очень дрянная реализация. Мне также не нравится идея set_exception_handler, если я не могу установить функцию как метод объекта. Причиной этого является то, что если я назначу функцию для обработки исключений, это будет первая функция в приложении. Все остальное – это метод объекта.
Надеюсь, я предоставил достаточно подробностей о сценарии. Я стараюсь держать это в чистоте и придерживаться лучших практик. Этот код будет проходить OSS, поэтому мне не хочется писать его 10 раз 🙂
call set_exception_handler
начале выполнения (не забудьте set_exception_handler
error_reporting()
). set_exception_handler
принимает в качестве параметра, что php вызывает «обратный вызов» . Вы можете передать метод объекта следующим образом:
// $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"; } }
Здесь содержится более подробная информация о «обратных вызовах» PHP. Чтобы использовать статический метод, обратный вызов – это что-то вроде
<?php set_exception_handler(array('MyClass','staticMethod')); ?>
Чтобы использовать метод из объекта-объекта, это:
<?php set_exception_handler(array($myObject, 'objectMethod')); ?>
И для использования глобальной функции это просто:
<?php set_exception_handler('my_global_function'); ?>
По тому, как это звучит, вы будете использовать set_exception_handler. Это гарантирует, что все исключения будут обрабатываться точно так же. Есть места для использования блоков try / catch в вашем приложении, скажем, если вы хотите проверить единственное исключение, которое не обязательно нужно поймать таким же образом.
Что касается установки set_exception_handler, я не уверен, что вы можете установить функцию как метод объекта, если это не статический метод. Похоже, это так. Более подробную информацию можно найти на странице http://us2.php.net/set_exception_handler