Исключения

zip111

Новичок
Исключения

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

Может кто-то на практике объяснить для чего же эти все фишки нужны?
 

Beavis

Banned
Re: Исключения

Автор оригинала: zip111
Никак не могу въехать для чего используюся исключения? Пока что считаю абсолютно ненужной фишкой ООП, во всяком случае в РНР. Точно такое же мнение об абстрактных классах и интерфейсах.

Может кто-то на практике объяснить для чего же эти все фишки нужны?
Об исключениях
 

zip111

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

Дело в том, что я понимаю как они работают, но я не понимаю для чего их применять. Отладка ошибок? Так это только в момент отладки может пригодиться, я так понимаю.

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

quad_4

Новичок
Сам этим пользуюсь редко, но вот моё понимание:

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

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

Абстрактный класс - это абстрактный класс :). Смысл говорит сам за себя. Вообще что такое класс? Класс это модель какого-то реального объекта. Абстрактый класс - это модель какого-то не реального объекта или объекта, создавать экземпляры которого нет смысла вообще или в данном контексте. Но его наследники будут полноценными :)

Исключения к ООП не имеют никакого отношения, применяются они не для отладки, а для отловки ошибок, причем не просто ошибок, а критических ошибок, когда программа явно не сможет выполнить свою задачу.
Для чего нужно ?
1. Ну, имхо, в основном для наглядности, например есть у тебя 1000 функций или классов, они там друг друга вызывают, и вдруг там где-то что-то не сработало и программа вылетает с ошибкой, потому что у тя там внутри куча if(!fopen(..)) exit('file not found'); тебе придётся рыться и искать. Если ты используешь исключения то в коде функций/классов ты можешь бросать исключения, потом заключить главный код (index.php напр) в try catch и в одном файле обрабатывать все исключительные ситуации.
2. Для работы с чужим кодом. Представь скачал ты допустим smarty и решил им пользоваться, но допустим у тебя под кеш всего 10 мегабайт, что явно будет иногда не хватать.
смарти заранее не знает как реагировать на ошибку out of space, ну и что ты будешь перекапывать все исходники smarty чтобы найти все места возможных ошибок чтобы правильно на них отреагировать ? я думаю нет. Вместо этого smarty кидает исключения, а ты их лови и обрабатывай как тебе угодно.
 

Wicked

Новичок
Исключения ... применяются они не для отладки, а для отловки ошибок, причем не просто ошибок, а критических ошибок, когда программа явно не сможет выполнить свою задачу.
Ну и КАША же у Вас в голове.
Все как раз наоборот. Исключительная ситуация - это ни в коем разе не ошибка. По крайней мере, до тех пор, пока ее таковой не расценит "ловящая" сторона.

-~{}~ 29.10.07 13:56:

zip111
Исключительные ситуации, в отличие от традиционного error handling'а, в пхп позволяют делать следующее:
* Иерархию исключительных ситуаций.
* Снабжение исключительных ситуаций дополнительными данными (вплоть до ссылок на конкретные объекты, и т.д.).
* Recovery, в том числе incomplete.
* Инкапсулировать в них некоторое поведение.

поправьте, если чего забыл...
 

quad_4

Новичок
По крайней мере, до тех пор, пока ее таковой не расценит "ловящая" сторона.
Произошла ошибка или нет решает программа:
if(...) throw new Exception(...);

в ловящей стороне рассматриваются варианты решения(преодоления) этой ошибки, например использовать резервную БД, или просто написать "зайдите попоже".

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

Исключительная ситуация и ошибка это разные вещи, ошибка - это когда пользователь неправильно ввел цифры с картинки, исключительная ситуация - это когда БД не отвечает - в этом случае дальнейшее выполнение программы невозможно (хотя бы без подключения к резервной БД).
 

korchasa

LIMB infected
Единственная ошибка в случаях с исключительными ситуациями - это необработанная ситуация. Исключения это просто способ получить информацию о ситуации используя уже готовое "хранилище", и "всплытие" исключений по иерархии объектов.
Соответственно:
в ловящей стороне рассматриваются варианты разрешения исключительной ситуации , например использовать резервную БД, или просто написать "зайдите попоже".
Исключительная ситуация и ошибка это разные вещи, ошибка - это когда пользователь неправильно ввел цифры с картинки, исключительная ситуация - это когда БД не отвечает - в этом случае дальнейшее выполнение программы невозможно (хотя бы без подключения к резервной БД).
Не обращайте внимания на слово "исключительная", она просто чуть-чуть не такая, как ожидалось . Даже ожидалась, но просто не очень хотелась ;)

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

Возьмем указание номера телефона пользователя. То, что введенное "нечто" должно являться номером телефона (и удовлетворять некоторым условиям) должно по идее проверяться в модели( иначе будет дублирование между контроллерами регистрации, редактирования, и админки, например). А обрабатываться эта ситуация должна в контроллере, т.к. реагировать надо по разному (хотя бы из-за текста сообщения, на самом деле разница может быть большая). Тем менее сам факт, что ситуация "появляется" в одном месте, а обрабатывается в другом - на лицо. Если случай простой и кнтроллер работает непосредственно с моделью, то можно спрашивать модель о ее самочувствии:
PHP:
$user  = new User();
$user->setPhone($phone);
if($user->isValid()) {
  //ругаемся матом
}
Но бывают случаи хуже - когда контроллер "далеко" от того места где ситуация имеет место быть. Например, когда номер телефона это отдельный класс:
PHP:
class User
{
  function setPhone($phone) {
    $this->phone = new Phone($phone);
  }
}
Тогда модель придется усложнять, чтобы транслировать данные о "неправильности" от объектов типа этого номера (valueObject) контроллеру. Причем надо еще будет указать, кто именно "сломался". Проще использовать исключения:
PHP:
$user  = new User();
try {
$user->setPhone($phone);
} catch (ValidationException $e) {
  //ругаемся матом именно на телефон, т.к. можем все узнать из $e
}
 

kvf77

Red Devil
zip111
тексту-то понаписали. Суть исключений в том, что раньше тебе приходилось писать кучу if чтобы проверять были ли ошибки. А с исключениями проще if можно написать только в одном месте и все ошибки обрабатывать именно там.

Что касается интерфейсов - они исключительно удобны, если ты пишешь систему в создании которой может участвовать несколько программистов. Навязывая им интерфейс ты ЗАСТАВЛЯЕШЬ их писать код так, как требует система, грубо говоря, если программист не будет реализовывать интерфейс, то ничего работать не будет. Еще польза интерфейса в том, что ты можешь написать быстро интерфейс и отдать его другим программистам, при этом ты можешь к тому времени еще не написать кода, реализующего интерфейс, однако другие программисты могут спокойно писать свой код, так как интерфейс гарантирует им работоспособность их кода.
 
Сверху