2009-02-17 3 views
15

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

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

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

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

+2

Не имеет отношения к вопросу, но, просто указывая, что PHP имеет несколько предопределенных дочерних исключений. См. Http://www.php.net/~helly/php/ext/spl/classException.html – Mario

ответ

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

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

    следующие типы ошибок не могут быть обрабатываются с определенной пользователем функции: 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"; 
        } 
    } 
    
+0

Большое спасибо, это будет маршрут, который я принимаю. – Syntax

3

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

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

11

Существует более конкретная информация о «обратных вызовах» PHP here. Чтобы использовать статический метод, обратный вызов что-то вроде

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

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

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

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

<?php 
set_exception_handler('my_global_function'); 
?> 
Смежные вопросы