Недавно я передал проект для школы, который я построил в CodeIgniter. Я должен был представить его моему учителю, и когда его спросили, как я справляюсь с определенными ошибками, он сказал мне бросить исключения, чтобы перехватить вещи намного раньше в цепочке событий.
Я узнал, как делать исключения и как использовать try...catch
блоки для uh, улавливать и обрабатывать их, но каким-то образом, когда я начал использовать CodeIgniter, я забыл все о них и больше не использовал исключения.
Вместо этого я просто обрабатывал свои ошибки вручную, из-за отсутствия лучшего слова: я бы использовал логические значения TRUE
и FALSE
чтобы проверить, правильно ли выполнялся запрос, и я бы использовал возвращаемое логическое значение для обработки результата запроса. Если TRUE
, я бы пошел дальше и делал свои вещи, если FALSE
я «вручную» выдал сообщение об ошибке. Проект был очень зависимым от AJAX, и сообщения об ошибках появлялись довольно причудливо, сбрасывая верхнюю часть страницы; не уверен, что это возможно, когда я бросаю исключение с throw new Exception
? Я знаю, что это в основном останавливает выполнение кода при возникновении исключения, так что бы это не так сломало?
Я также, кажется, помню, где-то читал, что бросание исключений – это не лучшая практика, но я больше не могу найти источник этого, и я не совсем уверен, если это так; в конце концов, мы научились использовать их в классе, и мне нравится верить, что мы изучаем лучшие практики там, ха-ха.
В случае необходимости я мог бы вернуться и попытаться найти фрагмент кода, где он указал, что я должен был исключить исключение. Однако на данный момент мне просто интересно, следует ли использовать исключения в моем коде или обрабатывать вещи вручную. Каковы наилучшие практики в этом отношении?
Благодарю.
Просто 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, поэтому, может быть, я должен сказать, что не будем использовать исключения.
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()); }
Я надеюсь, что все понятно и, возможно, есть кто-то с другим интересным мнением и более эффективной реализацией. До свидания.