CodeIgniter и бросание исключений - PullRequest
23 голосов
/ 02 июня 2011

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

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

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

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

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

Спасибо.

1 Ответ

30 голосов
/ 03 июня 2011

Просто к вашему сведению, я не использую исключения в 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.

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