Подтвердить что ты не робот

CodeIgniter и исключения бросания

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

Я узнал, как бросать исключения и как использовать блоки try...catch для uh, улавливать и обрабатывать их, но каким-то образом, когда я начал использовать CodeIgniter, я забыл все о них и больше не использовал исключения.

Вместо этого я просто обработал свои ошибки "вручную" из-за отсутствия лучшего слова: я использовал бы значения TRUE и FALSE boolean, чтобы проверить, правильно ли выполняется запрос, и я бы использовал возвращаемое логическое значение для обработки результата запроса. Если TRUE, я бы пошел дальше и делал свои вещи, если FALSE я "вручную" выдал сообщение об ошибке. Проект был очень зависимым от AJAX, и сообщения об ошибках появлялись довольно причудливо, сбрасывая верхнюю часть страницы; Не уверен, что это возможно, когда я делаю исключение с throw new Exception? Я знаю, что это в основном останавливает выполнение кода при возникновении исключения, так что бы это не так сломало?

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

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

Спасибо.

4b9b3361

Ответ 1

Просто FYI, я не использую исключения в CodeIgniter, потому что я много использую их в Kohana, только потому, что фреймворк бросает их, и все предназначено для работы с исключениями, в отличие от CodeIgniter. Использование исключений - хорошая практика, обеспечивающая, чтобы все ваши классы/рамки были разработаны для работы с ними.

Я не хочу (действительно, НЕ НУЖНО) хотеть входить в дискуссии по сравнению с концепцией, но мне нужно сравнить два фрагмента кода, чтобы прояснить ваш вопрос, один фрагмент из CI2 и другой из Kohana 3 (он родился как ветвь CI с лучшей объектно-ориентированной реализацией).

Вы увидите этот код CI2...

try
{
    $result = $this->db->insert('entries', $this->input->post());

    // This is not useful.
    if ( ! $result)
    {
        throw new Exception();
    }
}
catch (Exception $e)
{
    // Do something
}

Это не очень полезно. Сравните с этим кодом Kohana 3:

try
{
    $entry = ORM::factory('blog');
    $entry->values(Request::current()->post());
    $entry->save();
}
catch (ORM_Validation_Exception $e)
{
    Session::instance()->set('form_errors', $e->errors(TRUE));
}

Вы увидите, что это полезно, вы не бросаете исключение, которое бросает класс, который обрабатывает сохранение записи, а $e->errors имеет все ошибки проверки. Когда все предназначено для работы с исключениями, вы можете быть уверены, что это хорошая практика и очень удобная. Но это не относится к CI2, поэтому, может быть, я должен сказать, что не будем использовать исключения.


Возможный подход к исключениям в CI...

try
{
    $this->load->model('blog');
    $this->blog->save_entry($this->input->post());   // Handle validation inside the model with the Form_validation library
}
catch (Validation_Exception $e)   // You throwed your custom exception with the failed validation information
{
    // Do something with your custom exception like the kohana example
    $this->session->set('form_errors', $e->errors());
}

Надеюсь, все понятно и, возможно, есть кто-то с другим интересным мнением и более эффективной реализацией. Bye.