Обеспечение учета всех исключений при использовании PHP - PullRequest
4 голосов
/ 27 мая 2009

Я использовал исключения в Java, и мне нравится, что он не позволяет вам вызывать метод, пока вы не перехватите или не выбросите исключения, которые он может выдать.

Я ищу что-то похожее в PHP. Я понимаю, что PHP более динамичен, чем Java, и даже не позволяет вам определять исключения, которые он генерирует, но что мне ближе всего?

Мы документируем наши методы, используя PHP Doc, поэтому то, что вызвало E_WARNING, если вы вызвали метод без правильного блока try / catch или вызвало исключение без правильного комментария @thows, было бы идеально.

Ответы [ 4 ]

2 голосов
/ 27 мая 2009

Нет способа сделать это в самом PHP. Вам придется разобрать PHP и разобраться с этим самостоятельно. Попробуйте написать phc plugin для этого.

1 голос
/ 27 мая 2009

Я думаю, что вы можете просто воспроизвести это поведение в PHP, используя обработчики исключений и рефлексию.

class YourException extends Exception {
  public function __toString() {
    return __CLASS__;
  }
}

class MyObject {
    public function __construct(){}
    /**
    * @throws MyException
    */
    public function myMethod() {
        return 'foo';
    }
}

try {
    $o = new MyObject();
    $o->myMethod();
} 
catch(YourException $e) {
    $method = new ReflectionMethod('MyObject', 'myMethod');
    $method->getDocComment();

    $throws = // Get the @throws comment (foreach, regexp, whatever);
    if($e === $throws) {
        // do something
    }
}

Установка собственного обработчика исключений.

Получение и анализ комментариев с помощью механизма отражения (см. GetDocComment)

1 голос
/ 27 мая 2009

Я не уверен, что вы можете достичь поставленной цели. Среда PHP не анализирует, что может или не могла бы делать функция, что обычно было бы операцией времени компиляции для других языков (я думаю). Я не думаю, что вы даже можете найти такие вещи с помощью Reflection.

Однако вы ошибаетесь, когда говорите, что не можете определить создаваемые исключения, поскольку базовый класс Exception является полностью расширяемым . PHP не генерирует никаких исключений по умолчанию, но вызывает ошибки. Между инициирующими ошибками и Исключениями есть принципиальное различие, последнее по большей части является конструкцией пользовательского пространства.

Это не ваш вопрос, но я бы высказал предположение, что если вы хотите перейти в полностью ориентированную на исключения среду, вы можете написать свой собственный обработчик ошибок, используя set_error_handler () и управлять ошибками, вызванными PHP, и выкидывать исключение.

1 голос
/ 27 мая 2009

Я не думаю, что вы можете достаточно близко подобраться, потому что языковое ядро ​​не дает вам ничего общего с вами. В лучшем случае вы бы создали какой-то полностью функциональный механизм проверки / исключения исключений в пользовательском пространстве, который оказал бы абсолютно ужасное влияние на производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...