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

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

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

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

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

  1. Запускайте свои веб-запросы через скрипт Front Controller
  2. 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')); 
  3. Оберните свой диспетчерский код с помощью 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 ().

  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"; } } 

Здесь содержится более подробная информация о «обратных вызовах» 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