Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой смысл в исключениях (Exeption)? 
:(
    Опции темы
Sentox
Дата 5.7.2012, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Цитата(Gold Dragon @ 5.7.2012,  22:56)
Sentox, конечно ты прав.. но это уже конкретный подход к вопросу... smile В любом случае мы же в исключениях должны прописывать как минимум сообщения об ошибках, а значит программер должен знать и их

Не обязательно, их можно по дефолту определить как свойство класса и использовать не передавая сообщения.
Например:
Код

DivisionByZeroException extends ArithmeticalException
{
    public $message = 'Что ж ты делаешь, нельзя делить на ноль!!!';
}


smile

а ещё шире
Код

ArithmeticalException extends Exception
{
    public $log = null;

    public function __construct($msg = false)
    {
         $this->log = new Log();
         parent::__construct($msg);
    }
}

DivisionByZeroException extends ArithmeticalException
{
    public $message = 'Что ж ты делаешь, нельзя делить на ноль!!!';
}


Это сообщение отредактировал(а) Sentox - 5.7.2012, 23:04
PM MAIL   Вверх
baldina
Дата 6.7.2012, 10:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(Gold Dragon @  5.7.2012,  22:51 Найти цитируемый пост)
кстати,... "хреновый вы программист" - это как?

Цитата(Fortop @  5.7.2012,  15:10 Найти цитируемый пост)
хреновый вы программист, если не в состоянии выполнить обобщение

ключевое слово - обобщение

Добавлено через 7 минут и 9 секунд
Цитата(Gold Dragon @  5.7.2012,  22:56 Найти цитируемый пост)
 В любом случае мы же в исключениях должны прописывать как минимум сообщения об ошибках, а значит программер должен знать и их 

Использование исключений никак не связано с сообщениями об ошибках. Сообщения - лишь один из видов реакции на.
Пример: если доступен файл А, надо использовать его, в противном случае используется файл B. Вызывающая подсистема вообще не в курсе, какой файл используется, она работает с дескриптором открытого файла. Файл B всегда доступен (допустим, это стандартный поток).
Проблема в том, что файлы А и В открываются на совершенно разных уровнях приложения, обычным if не обойтись.
Вот тут и помогут исключения, что бы не тащить информацию об открытом файле снизу вверх.
PM MAIL   Вверх
ksnk
Дата 6.7.2012, 14:35 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



baldina, Исключения подразумевают, ( обычно, а не в php  smile)  3 реакции на исключительную ситуацию - продолжить, пропустить операцию и  повторить операцию еще раз. То есть, в принципе - это своеобразный callback, совместно с goto В PHP от возможности повторить операцию напрочь отказались, вероятно потому, что многие стандартные функции php не генерят исключений, а выводят коды ошибок. Tо есть в PHP исключения, по сравнению с обычным их применением, выродились в простую реакцию на исключительные события. Пользой осталась только возможность обработки самих таких событий в другом месте.

так что фраза 
 
Цитата(baldina @  6.7.2012,  10:46 Найти цитируемый пост)
Пример: если доступен файл А, надо использовать его, в противном случае используется файл B. 

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
baldina
Дата 6.7.2012, 18:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(baldina @  6.7.2012,  10:46 Найти цитируемый пост)
Вызывающая подсистема вообще не в курсе, какой файл используется, она работает с дескриптором открытого файла

я имел в виду что исключения возбуждаются и обрабатываются вне вызывающей подсистемы, в сервисной, но на разных уровнях. вызывающая (в отношении А и В) работает без исключений.
и я не имел в виду только php (хотя в php модель исключений не слишком отличается от java или c++)
Цитата(ksnk @  6.7.2012,  14:35 Найти цитируемый пост)
3 реакции на исключительную ситуацию - продолжить, пропустить операцию и  повторить операцию еще раз

на исключительную ситуацию есть 2 разумные реакции - попробовать что-то сделать или аварийно завершиться
Цитата(ksnk @  6.7.2012,  14:35 Найти цитируемый пост)
 В PHP от возможности повторить операцию напрочь отказались

а где не отказались? ;-)
PM MAIL   Вверх
ksnk
Дата 6.7.2012, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(baldina @  6.7.2012,  18:46 Найти цитируемый пост)
а где не отказались? ;-) 

Хм... Действительно, это я ступил.  smile   Только в бейсике от MS можно вернуться в то-же место и повторить все заново. Мне казалось, что такая удобная фенечка откуда-то стырена... Оказалось - нет, оригинальная бейсиковая фича... Удобная, кстати, фенечка. Мне ее не хватало местами  smile  
В остальных доступных мне языках - нельзя. Так что php тут не оригинален, просто так оно и сделано, как везде.

Все равно пример остался непонят.
Есть некий сервис - линейная работа с неким файлом. С точки зрения вызывающей стороны - процедура с параметром - хандлом файла. Вызывающая сторона смотрит на файлы A и B и делает вызов с одним или другим параметром. В каком месте тут присутствуют исключения?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sentox
Дата 7.7.2012, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Вызывающий, сервис - это скорее всего "клиент" (код использующий функцию).
Он всего лишь имеет какой то алгоритм работы, в котором был вызов функции. 
А вот сама функция (подсистема) это 
Цитата

некий сервис - линейная работа с неким файлом

открытие, существование ....

baldina, имеет ввиду что исключения генерируются в функции (подсистеме) и не обрабатываются и не перехватываются самой функцией (подсистемой)
Код

function file($file)
{
    // Генерация исключения, но не обработка и перехват
    if(Файла нет) throw new Exception('file not found');
    return fopen($file);
}

// Вызывающий сервис например
try
{
    $hd = file('file');
}
catch(Exception $e
{
    error_log($e->getMessage());
}


Если я правильно понял ситуацию smile

Это сообщение отредактировал(а) Sentox - 7.7.2012, 00:04
PM MAIL   Вверх
Gold Dragon
Дата 7.7.2012, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



а сколько народа реально применяет Исключения в своих проектах? Я пока нет smile но скорее всего в новых буду. И даже не потому что это "лучше", а потому что наверное "это правильно"


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 9.7.2012, 10:17 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Цитата(ksnk @  6.7.2012,  23:34 Найти цитируемый пост)
сделано, как везде

ну почему же везде... скорее, под влиянием c++, а в с++ когда создавалась модель исключений было принято решение "без продолжений", потому что это сложно реализуется, нужно крайне редко, и в этом случае можно смоделировать.
Цитата(Sentox @  7.7.2012,  00:02 Найти цитируемый пост)
baldina, имеет ввиду что исключения генерируются в функции (подсистеме) и не обрабатываются и не перехватываются самой функцией (подсистемой)

да
Цитата(Gold Dragon @  7.7.2012,  21:42 Найти цитируемый пост)
а сколько народа реально применяет Исключения в своих проектах?

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

open_database ();
if (have_rights ($user, $file, RIGHTS_READ))
  readfile ($file);
else
  notify (HAS_NO_RIGHTS);

возможны следующие исключительные ситуации:
1. бд недоступна
2. пользователь запрашивает несуществующий файл
3. доступ к файлу запрещен. этот случай - часть нашей задачи, но в рамках модели "открыть-проверить-прочитать" его удобно представлять как исключительную ситуацию
теперь поглядим, как этот код будет выглядеть с обработкой исключений и без нее, с кодами возврата.
без исключений:
Код

if (open_database ()) {
  if (file_exists ($file)) {
    if (have_rights ($user, $file, RIGHTS_READ))
      readfile ($file);
    else
      notify (HAS_NO_RIGHTS);
  }
  else
    notify (FILE_NOT_FOUND);
}
else
  notify (CANT_OPEN_DB);

Код

function check_rights ($user, $file, $rights) {
  if (!have_rights ($user, $file, $rights))
    throw new Exception(HAS_NO_RIGHTS);
}

function check_file ($file) {
  if (!file_exists ($file))
    throw new Exception(FILE_NOT_FOUND);
}

try {
  open_database ();
  check_file ($file);
  check_rights ($user, $file, RIGHTS_READ);
  readfile ($file);
}
catch (Exception $e) {
  notify ($e->getMessage ());
}

какой вам кажется проще для понимания и расширения? и это простейший пример, без наследования и т.п.
Цитата(Gold Dragon @  7.7.2012,  21:42 Найти цитируемый пост)
но скорее всего в новых буду. И даже не потому что это "лучше", а потому что наверное "это правильно"

надо делать только то, что понимаешь. есть лишь один довод использовать какую-то фичу впрок: если она улучшает декомпозицию проекта, т.е. делает проект более приспособленным к расширению. 
PM MAIL   Вверх
Sentox
Дата 9.7.2012, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Ещё к примеру baldina, добавлю: это удобочитаемо, потому как по Мартину программист существо социальное и код легче читать, а не просто что бы он работал (меня умиляют такие программисты, которые говорят "Ну оно ж работает!"), и одно из самых главных качеств легко ставится на тесты допустим PHPUnit.
Если поставить на тесты первый пример, то придётся на каждую ошибку задавать обработку-тест что так же повышает сложность поддержки тестового кода, а мы как раз должны использовать тесты с максисмально простым кодом, для лучшей поддержки.

Это сообщение отредактировал(а) Sentox - 9.7.2012, 11:22
PM MAIL   Вверх
Zerstroer
Дата 9.7.2012, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: 1
Всего: 3



baldina привел самый показательный пример за всю ветку. Десятки лентяев-графоманов могут вздохнуть спокойно. 
В чем суть дискуссии - я не понимаю.
Применение исключений - вопрос религии. Применять их нужно по мере необходимости. Необходимость трактуется - концепцией проекта, концепцией языка, степенью сознательности разработчика.

Цитата(Gold Dragon @  7.7.2012,  19:42 Найти цитируемый пост)
а сколько народа реально применяет Исключения в своих проектах?
 ровно столько же, сколько и не применяет.

Цитата(Gold Dragon @  7.7.2012,  19:42 Найти цитируемый пост)
а потому что наверное "это правильно" 
 нет никакого "правильно" и "не правильно", объективно оценивайте проект и принимайте адекватное решение о целесообразности использования исключений. Код должен стремиться к очевидности, в первую очередь.


--------------------
In silico
PM MAIL ICQ   Вверх
Sentox
Дата 9.7.2012, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Zerstroer,
Цитата

baldina привел самый показательный пример за всю ветку. Десятки лентяев-графоманов могут вздохнуть спокойно.  


Привёл одну из сторон удобства применения исключений. В реальности удобств применений гораздо больше smile
PM MAIL   Вверх
Zerstroer
Дата 9.7.2012, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

Репутация: 1
Всего: 3



Цитата(Sentox @  9.7.2012,  10:54 Найти цитируемый пост)
Zerstroer,
Цитата

baldina привел самый показательный пример за всю ветку. Десятки лентяев-графоманов могут вздохнуть спокойно.  

Привёл одну из сторон удобства применения исключений. В реальности удобств применений гораздо больше  


Он привел очень наглядный и истинно канонiчный пример "Вот вам без исключений, двоечники, вот вам - с исключениями, оцените разницу".  Лично - огорчусь за baldina, если он пример взял не из своей головы, а из учебника.


--------------------
In silico
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1401 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.