2013-12-18 3 views
5

Я использую PHP с каркасом CodeIgniter. Я прочитал несколько статей, в которых использование методов try/catch в плохой практике.PHP-приложение, когда использовать try/catch

Я понимаю, использовать протоколирование в развитии, когда может возникнуть потенциальная ошибка, и пусть фактическая ошибка произойдет затем зарегистрировать ее с помощью log_message('level', 'message')

Но когда в развертывании вы хотите, чтобы подавить и обрабатывать любые ошибки, которые возникают. Должен ли я использовать попытаться/поймать блоков, например, в чем-то вроде ...

try { 
    $this->data['important'] = $this->Test_Model->do_something($data); 
    if(empty(data['important'])) { 
    throw new Exception('no data returned'); 
} 

catch (Exception $e) { 
    //alert the user then kill the process 
    var_dump($e->getMessage()); 
} 

Я смущен, когда я использую использовать Try/правильно поймать.

+0

Существует несколько случаев, когда вы не хотите подавлять исключения. Это очень интересная классификация исключений Эрика Липперта http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx. –

+0

Выбрасывание исключения в том же блоке кода, что и его обработка, - это плохая практика. Исключения очень полезны для разделения компонентов. 'FormBuilder' выдает исключение,' Action' обрабатывает его. 'EmailValidation' генерирует исключение,' UserModel' обрабатывает его. И т.п.#IMHO – Rudie

+0

Кроме того, исключения очень полезны, когда ваш метод не знает, что делать с проблемой, но некоторые из методов, которые вызвали ваш. Например. если вы не смогли получить некоторые данные из API, будет целесообразно выкинуть исключение и позволить вызывающему методу решить, что делать (например, выполнить сбой или сделать другой вызов). –

ответ

14

Там есть ошибка синтаксиса в коде, он должен быть:

try { 
    $this->data['important'] = $this->Test_Model->do_something($data); 
    if(empty($this->data['important'])) { 
    throw new Exception('no data returned'); 
    } 
} catch (Exception $e) { 
    //alert the user. 
    var_dump($e->getMessage()); 
} 

Использование try/catch не плохая практика.

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

Журналы для вас. Если ваше приложение не является здоровым, и вы зарегистрировали возможные проблемные точки, вы можете легче идентифицировать ошибки. Основное различие между вашим журналом и собственным журналом - это контекст, собственный журнал не имеет контекста, у него есть только встречаемость и, возможно, трассировка стека.

1

Исключение должно быть пойманным только в двух случаях:

  1. Когда само исключение не требует немедленного прекращения выполнения вашей программы, а именно: блок поймать интеллектуально обрабатывает исключение и позволяет выполнение программы после блока чтобы произойти в sane способ.
  2. Если вы хотите выполнить дополнительную обработку ошибок и завершить работу, и/или журнал/отображение информации об ошибке. Необязательно, исключение может быть повторно выбрано исключение для «пузыря вверх» в стеке, чтобы другие подпрограммы могли сделать то же самое. например:

    try { 
        //code 
    } catch(Exception $e) { 
        echo "friendly error message"; 
        logging_function($e->getMessage()); 
        throw $e; 
    } 
    

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

try { 
    // code 
} catch(Exception $e) { /* L7: Exception handling is for squares! */ } 

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

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