2013-02-18 6 views
2

Building upon a question I already asked regarding exceptions, боюсь, что я мог бы неправильно писать функции php или злоупотреблять использованием исключений. Причина, почему я говорю об этом, потому что если пользовательские исключения будут пойманы с помощью попытаться/поймать блоков, то следующую функцию:Функции записи, относящиеся к исключениям

public function get_specific_page($page) { 
    if (!is_array($this->_page)){ 
     throw new AisisCore_Template_TemplateException("<div class='error'>Trying to get a property from a non array.</div>"); 
    } 

    return $this->_page[$page]; 
} 

бы тогда можно назвать такие, как:

try{ 
    get_specific_page($page); 
} 
catch(Exception $e){ 
    echo $e->getMessage(); 
} 

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

Так что мой вопрос в том, как я бы лучше написал такие функции, чтобы у меня не было файлов php поверх загруженных инструкций try catch, но вы все равно сможете иметь собственные пользовательские функции.

Является ли это очевидным, как написать попытку уловить внутри функции?

Причина, по которой я спрашиваю, если я использую работу с работами в области и в компаниях, где мы пишем наши функции, как вы видите выше. Как верами я работал с кодовыми базами, которые имеют тонны этих функций, и я не вижу половину файлов, которые использованияКонтактные их делают кучу попробовать уловы ...

Update:

Я просматривал источник Зенд, чтобы лучше понять исключения и наткнулся на это:

public function setMessage($messageString, $messageKey = null) 
    { 
     if ($messageKey === null) { 
      $keys = array_keys($this->_messageTemplates); 
      foreach($keys as $key) { 
       $this->setMessage($messageString, $key); 
      } 
      return $this; 
     } 

     if (!isset($this->_messageTemplates[$messageKey])) { 
      require_once 'Zend/Validate/Exception.php'; 
      throw new Zend_Validate_Exception("No message template exists for key '$messageKey'"); 
     } 

     $this->_messageTemplates[$messageKey] = $messageString; 
     return $this; 
    } 

Вы можете видеть, как они бросают новое сообщение об исключении вблизи дна, эта функция не вызывается, выполнив:

try{}catch(){} 

еще, когда он бросает исключение, нет никакой проблемы с «неперехваченного исключением с сообщением»

+0

У Zend есть свои обработчики исключений, некоторые из которых обработчик сам забирает. – vikingmaster

ответ

3

На мой взгляд, ваш подход является правильным в целом. Однако несколько примечаний:

  1. Вы должны воздерживаться от использования форматирования HTML в сообщениях об исключениях. Как правило, вы не знаете, как будет обрабатываться исключение, которое вы выбрали. Например, обработчик исключений может просто записать сообщение в файл журнала (тогда вы не хотите форматировать HTML), представить его пользователю в специальном представлении с ошибкой (в этом случае сам вид должен содержать форматирование HTML), или просто игнорировать его (тогда нет необходимости форматировать, во всяком случае).
  2. Ловить только исключения, которые вы можете использовать. Если вы знаете, что ваша функция выбрасывает AisisCore_Template_TemplateException, вы должны просто поймать это исключение и позволить всем остальным исключениям перейти к обработчику исключений, чтобы мог обрабатывать их. Вы можете использовать set_exception_handler для определения такого обработчика исключений, который по умолчанию игнорирует все неиспользуемые исключения (это, вероятно, имеет место в вашем примере из Zend Framework). Plainly put: Исключайте исключения только в тех местах, где вы знаете, как обращаться с ними.
  3. Используйте исключения только в том виде, в каком подразумевается название: для обработки (неожиданных) исключений в потоке управления. Использование исключений для управления регулярным потоком вашей программы возможно, но в целом считается плохим дизайном (точно так же, как и побочная заметка, образцы кода выглядят хорошо).

Для полноты картины, некоторые альтернативы использования исключений:

  1. Используйте коды возврата вместо исключений. Это старинная школа C-стиля. Преимущество состоит в том, что вам не нужно обертывать утверждения с помощью try/catch-statements. Однако вы должны проверить возвращаемые значения каждой процедуры, что легко забыть. При использовании исключений, с другой стороны, вы уменьшаете риск непредвиденных ошибок, так как исключенные исключения приводят к фатальной ошибке по умолчанию.
  2. Используйте ошибки PHP. Для этого см. Функцию trigger_error. Пользовательские ошибки, однако, практически невозможно поймать в PHP (за исключением использования set_error_handler, который работает только на глобальном уровне).
+0

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

+0

Ну, точка, которую я на самом деле пыталась сделать, заключалась в том, что, на мой взгляд, исключения более элегантны и более безопасны в использовании, чем коды возврата, но этот вопрос, очевидно, зависит от индивидуального вкуса ...;) – helmbert

Смежные вопросы