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

Поиск:

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


Опытный
**


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

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



Цитата(Gold Dragon @  5.7.2012,  13:32 Найти цитируемый пост)
И для разработки больших проектов этот механизм желательно задействовать.

Ну вот, уже свели тему к большим проектам. А большие проекты - это те, которые делает команда программистов (как правило). А в команде - это вопрос договорённостей по стилю написания кода. Принято писать с исключениями - значит будешь, никуда не денешься. Договоритесь, что они не нужны - не будете использовать.
PM MAIL   Вверх
Sentox
Дата 5.7.2012, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


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

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



Цитата(teroni @ 5.7.2012,  13:29)
Тоже считаю их больше стилем написания кода, нежели чем-то функционально полезным.

Нет, не совсем.
Это другая парадигма безопасного программирования, чем то похожа ситуация противопоставления функциональной парадигмы программирования - парадигме ООП.
PHP язык развивающийся с процедурного, поэтому как говорится каждому методу своё место. smile 
В больших проектах больше ошибок, поэтому логичней поставить развитую структуру отлова потока ошибок, при чём чем более разнообразных предметных концепций тем больше стоит внедрять логику исключений. 
Хотя если используешь парадигму исключений, я бы использовал бы и далее да же на сайте визитке. Написания кода в этом случае почти не увеличивается, почти - это только определение самих классов (типов) ошибок и то минимум пустых. Хммм ... я бы да же сказал что парадигма статусов ошибок что исключений в написании кода практически одинакова. Так что это кто как любит: кто копчёную колбасу, а кто и грибочки под водочку smile

Это сообщение отредактировал(а) Sentox - 5.7.2012, 13:59
PM MAIL   Вверх
Gold Dragon
Дата 5.7.2012, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вот маленький пример
Код

function ab($int){
    if($int === 0)
        Error::DelenieNaNol();
    elseif(!is_int($int))
        Error::NeChislo();
    else
        $a = 10 / $int;
}

//.....................

class Error{
    public static function DelenieNaNol(){
         echo 'Деление на ноль';
    }
    public static function NeChislo(){
         echo 'Это не число';
    }
}

или так
Код

function ab($int){
    if($int === 0)
        Error::Mes(1001);
    elseif(!is_int($int))
        Error::Mes(1002);
    else
        $a = 10 / $int;
}

//.....................

class Error{
    private $error;
    
    private __construct(){
        $this->error = array(
        1001 => 'Деление на ноль',
        1002 => 'Это не число'
        );
   }

    public static function Mes($err){
        $cod = new Error();
         echo $cod->error[$err];
    }
}

ну и чем это хуже исключений smile И просто и красиво

Это сообщение отредактировал(а) Gold Dragon - 5.7.2012, 14:21


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


Опытный
**


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

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



Цитата(Gold Dragon @  5.7.2012,  12:19 Найти цитируемый пост)
ну и чем это хуже исключений


Тем, что у вас нет автоматического отлова аварийной ситуации. Все вызовы Error инициированы вами в ручном режиме. Это предвиденные вами ошибки. Вы же понимаете, что это далеко не все варианты аварийного развития событий.

Пример на псевдокоде :

Код

/*Соединяемся и посылаем запрос к базе данных*/
ЕСЛИ ( СоединитьсяСБазой(ИмяБазыИПрочиеРеквизиты) == ОШИБКА ) { // Будем считать, что в функции "СоединитьсяСБазой() у нас определяется ДескрипторСоединения
      ВЫЗОВ Error('Ошибка при соединении с базой');
}
ЕСЛИ ( ОтправитьЗапрос(ТексеSQLЗапроса, ДескрипторСоединения) == ОШИБКА ) {
      ВЫЗОВ Error('Ошибка при запросе');
}


Теперь предположим, что по неведомым причинам у вас каждый раз, сразу же после соединения срывается коннект к базе. Что в итоге получим? В итоге получаем Error('Ошибка при запросе'). Что начинаем делать? Я бы начал тщательно и внимательно анализировать SQL запрос. А это в данной ситуации - действие неверное, как следствие трата времени, сил, нервов и т.п.
Пример далек от идеала, но определенную ясность, я думаю, внесет.





Это сообщение отредактировал(а) Zerstroer - 5.7.2012, 14:34


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


как то так
**


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

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



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

function ab($int){
    if($int === 0)
    {
         // Такой метод
         renderErrorPage(Error::DelenieNaNol())
    }
    elseif(!is_int($int))
        renderErrorPage(Error::NeChislo());
// Далее могут происходить ещё масса валидаций например и все с одним и тем же выводом страницы ошибок renderErrorPage
// Переносить в каждый метод вывод страницы ошибок нет смысла, 
// так как это жёстко структурирует алгоритм и фактически не должно быть вложено в знания класса Error
    else
        $a = 10 / $int;
}
//.....................
class Error{
    public static function DelenieNaNol(){
         echo 'Деление на ноль';
    }
    public static function NeChislo(){
         echo 'Это не число';
    }
}


Вот код с исключением, код конечно не выявляет все стороны исключений но всё же smile:  
Код

function ab($int){
    try{
        if($int === 0)
           // Так же при генерации можно добавить свою информацию например
           //  $e = new DivisionByZeroException($translaitMesageDivisionByZero);
           //  $e->log = new ErroLog();
           // после будет доступно в catch: как $e->log->write('my_data');
            throw new DivisionByZeroException($translaitMesageDivisionByZero);
        elseif(!ctype_digit($int))
            throw new NotDigitalException($translaitMesageNotDigital);
        else
            $a = 10 / $int;
     }
    catch(ArithmeticalException $e)
    {
        $message = 'Error ab(): ' . $e->getMessage() . ' file: ' . $e->getFile() . ' line: ' . $e->getLine() . '<br>' .  $e->getTracert();
        if(IS_DEBUG === false)
            $e->log->write($message);
        else
            renderErrorPage($message);
    }
}


Если убрать коментарии написания кода меньше.
И при написании кода я концентрировался на нормальном пути работы алгоритма, а в точках ошибок только ставил псевдокод. В данном случае конечно это не особо видно, но каогда у тебя сложный алгоритм обработка ошибок отвлекает. Это конечно можно делать и без исключений но в данном случае все типы исключений обрабатываются одинаково и в одном месте. Так же можно применять по типам ошибок свои обработчики. И что ещё полезней, при генерации ВЫ можете совершенно не перехватывать в этой функции ошибки а дать возможность вызывающим это сделать, что даёт возможность более удобно расслаивать систему. 

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


Эксперт
****


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

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



Цитата(Gold Dragon @  5.7.2012,  12:53 Найти цитируемый пост)
 у меня нет проблем ни со зрением, ни с психикой

бездоказательно.
А вот наличие других проблем у вас вполне видно по вашей же цитате ниже.

Цитата(Gold Dragon @  5.7.2012,  12:53 Найти цитируемый пост)
А причём тут вообще это??? Мы говорим о программе, а не о железе(!)

А при том, что хреновый вы программист, если не в состоянии выполнить обобщение.
Вас не заставляют чинить сетевую карту программно, но обработать отсутствие подключения к БД вы обязаны.
Вы же в виду определенных проблем не можете понять что есть ошибки неустранимые, но требующие обработки-реакции программы на них.
Для вас есть только один способ борьбы - "устранить нештатные ситуации"  smile 


P.S.
Цитата(Gold Dragon @  5.7.2012,  12:53 Найти цитируемый пост)
По форуму я вижу только твои рассуждения, но ни разу пример кода. 

Архивы почитайте smile
В том числе и на ваши же вопросы.
Тот факт что вы не понимаете написанного не отменяет его наличия smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Gold Dragon
Дата 5.7.2012, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Sentox @  5.7.2012,  16:00 Найти цитируемый пост)
Второй не красивый, первый лучше.
Ну в принципе имея таблицу кодов, второй вариант получается достаточно компактный. Практически такой же как и исключения. В принципе и логи формировать тоже можно, добавив в обработчик номер строки и имя файла типа такого 
Код

Error::Mes(1002, __FILE__, __LINE__);

ну или даже так
Код

Error::Mes(1002, __FUNCTION__);



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


как то так
**


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

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



Цитата(Gold Dragon @ 5.7.2012,  16:12)
Цитата(Sentox @  5.7.2012,  16:00 Найти цитируемый пост)
Второй не красивый, первый лучше.
Ну в принципе имея таблицу кодов, второй вариант получается достаточно компактный. Практически такой же как и исключения. В принципе и логи формировать тоже можно, добавив в обработчик номер строки и имя файла типа такого 
Код

Error::Mes(1002, __FILE__, __LINE__);

ну или даже так
Код

Error::Mes(1002, __FUNCTION__);

Можно, конечно. Но для поддержки другими программистами да и самому нужно будет запоминать эти коды. А если они ещё будут раздуваться непомерно или чего хуже изменяться (в этом случае по всему проекту приидётся менять), то поддержка ошибок будет обременительной, что скажется на их упрощении при кодировании и опущении программистами обработки их. 
Можно конечно немного упростить схему и передавать константы описывающие код например ARITHMETICAL_STATUS_ERROR, но всё равно не избавляет от дублирования кода и гибкости использования (например отдать обработку на уровень выше).

Это сообщение отредактировал(а) Sentox - 5.7.2012, 16:28
PM MAIL   Вверх
Aliance
Дата 5.7.2012, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

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



Gold Dragon, в совокупности с наследованием, исключения предоставляют мощную систему для работы проекта. Поясню на примере псевдокода:
Код

class Exception_404 extends Exception {}

// ...

try {
    $request->dispatch();
}
catch (Exception_404 $e) {
    die('page not found');
}
catch (Exception $e) {
    die('Error');
}

PM MAIL WWW ICQ Skype   Вверх
baldina
Дата 5.7.2012, 17:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Gold Dragon, исключения с одной стороны, и любые другие средства, включая Ваши красивые классы, с другой - разные подходы к обработке ошибок. Исключения - помощь языка в декомпозиции при обработке ошибок. Написав кучу классов вы, возможно, достигнете некоторого уровня декомпозиции, но не настолько, как с использованием исключений. Результат отказа от исключений - больше работы, но менее управляемый код.
Это в теории. На практике надо от параметров Вашего проекта отталкиваться, что бы принять решение.
Не ругайтесь, а попробуйте понять. Мы терпеливые, объясним столько, сколько потребуется.
Цитата(Fortop @  5.7.2012,  15:10 Найти цитируемый пост)
 при том, что хреновый вы программист, если не в состоянии выполнить обобщение.

Fortop ведь тут прав, но он не обругал Вас, а хотел стимулировать Вашу мысль  smile 
PM MAIL   Вверх
Gold Dragon
Дата 5.7.2012, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Sentox @  5.7.2012,  17:25 Найти цитируемый пост)
 Но для поддержки другими программистами да и самому нужно будет запоминать эти коды. 
Тут ты не прав. программисты под "конкретный движок" должны знать не только коды ошибок, но все интерфейсы (на то они и пишутся). Т.е. программисты как то должны знать API smile

Цитата(baldina @  5.7.2012,  18:53 Найти цитируемый пост)
Исключения - помощь языка
да(!) Просто складывается впечатление что разработчики PHP хотят угнаться за ..... теми же СИшниками или Дельфистами... Хотя... вернувшись к Делфи я понял что PHP имеет очень много "вкусностей" которых очень не хватает Делфи..

Цитата(baldina @  5.7.2012,  18:53 Найти цитируемый пост)
Fortop ведь тут прав, но он не обругал Вас, а хотел стимулировать Вашу мысль
Fortop хороший человек smile и тем более я не в том возрасте чтобы меня можно обругать... Но я (так как очень закостенел) не люблю когда говорят что я не прав... Я люблю доказательства.. и очень сильные.. Я юрист и слова это большое оружие, но только для "обывателей" smile Я же тут где-то сказал что обоснуйте мне что "ИСКЛЮЧЕНИЯ ЭТО ОЧЕНЬ КРОТУ" smile И вообще, Fortop хороший человек, хоть кто-то против, хоть с кем то можно поспорить. Хотя всё равно лучшее доказательство - это код примера ;)

Aliance, даже по другому и не рассматриваю ;) Но ведь всё равно тут я не увидел явных фанатов исключений smile


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


неОпытный
****


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

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



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

потому что фанатизм — не лучший подход.
преимущества расписали. не хочешь использовать - не используй.
PM MAIL   Вверх
Gold Dragon
Дата 5.7.2012, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Добавлено через 1 минуту и 51 секунду
skyboy, хочу использовать. но хочу понять и преимущества smile

PS
согласен, фанатизм это болезнь... 


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


как то так
**


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

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



Цитата(Gold Dragon @ 5.7.2012,  22:41)
Тут ты не прав. программисты под "конкретный движок" должны знать не только коды ошибок, но все интерфейсы (на то они и пишутся). Т.е. программисты как то должны знать API 

Я не о том знать или нет (здесь безоговрочно что следует), смысл в том что код 1002 ничего осмысленного не несёт, а если он будет описан например константой мало того что будет читабельный код, так же его можно будет изменить легко, только в одном месте определения константы.
В исключениях коды или описательные константы заменют типы (классы), при чём подтипы могут наследовать от других  так сказать "кодов" функциональность или расширять её, например использование другого текста или добавления своего, что очень затруднительно со скалярными величинами.

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


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


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

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



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


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

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

Важно:

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

Внимание:

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

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

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


 




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


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

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