Объясните что такое исключения на простом и понятном примере

Тема в разделе "PHP", создана пользователем Solomon Kane, 10 авг 2011.

Модераторы: latteo
  1. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Мистика какая-то, почти во все определения и их функционирование ООП на PHP въехал, а исключения понять не могу. Смотрю в книгу, вижу фигу. В своё время так с конструктором было, вроде даже тут тему создавал. Кто-то может привести нормальный пример с объяснением человеческим языком, зачем это вообще надо? Под "нормальным" имеется в виду пример, который часто встречается на практике, а не так, как любят авторы учебников взять какой-то бред, который в реальных программах вообще не встречается, и начать на основе этого бреда строить всю главу.

    Спасибо!
     
  2. PHPCod3r

    PHPCod3r

    Регистр.:
    7 июн 2010
    Сообщения:
    261
    Симпатии:
    25

    Вопрос как я понимаю про это
    http://de.php.net/manual/ru/class.exception.php
    http://www.php.net/manual/en/language.exceptions.php
    http://phpclub.ru/faq/PHP5/Exception

    Вообщем то вот статья на эту тему
    http://habrahabr.ru/blogs/development/51518/
    много конечно общих слов, но понять что это можно....

    Или вы хотите увидеть как это работает в каком нить распространенном пхп приложении?
     
  3. Solomon Kane

    Solomon Kane Постоялец

    Регистр.:
    26 авг 2009
    Сообщения:
    144
    Симпатии:
    9
    Оно, но не могу въехать в принцип работы и вообще в суть - зачем это надо? Если быть точнее, вопроса глобальных три - зачем это надо, если есть if else и прочее? Как точно это работает? Есть ли какой-то простой конкретный пример, после которого даже обезьяна поймёт, как надо использовать исключения :).
     
  4. OpS87

    OpS87

    Регистр.:
    9 авг 2011
    Сообщения:
    175
    Симпатии:
    15
    PHP:
    <?php
    function inverse($x) {
        if (!
    $x) {
            throw new 
    Exception('Division by zero.');
        }
        else return 
    1/$x;
    }

    try {
        echo 
    inverse(5) . "\n";
        echo 
    inverse(0) . "\n";
    } catch (
    Exception $e) {
        echo 
    'Caught exception: ',  $e->getMessage(), "\n";
    }

    // Continue execution
    echo 'Hello World';
    ?>
     
  5. Phrack

    Phrack

    Регистр.:
    3 ноя 2010
    Сообщения:
    264
    Симпатии:
    38
    Очень простой пример:
    Представь, что мы селектим из БД и ожидаем получить 1 строку. Ровно 1 строку.

    Но так получается, что БД заполнена не правильно заполнена и в результате получается или ноль значений или более одного. Это - исключительная ситуация, которую разработчик не ожидал. Поэтому надо обрабатывать такие вещи
     
  6. psn

    psn

    Регистр.:
    30 апр 2009
    Сообщения:
    227
    Симпатии:
    30
    исключение это экземпляр класса содержащий подробности возникновения ошибки, стек возникновения + описание ошибки... вообще лучше без необходимости их не использовать вообще, выброс исключения требует время... при частом использовании это накладно... ну пример уже писали выше (в нем также можно обойтись без использования исключений)
     
  7. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    558
    Исключения - это инструмент для Единой обработки ошибок. И в больших проектах лучше использовать его. И Не пихать во всё что движется. Большое время обработки- бред незнающих. Наверно когда юзер отправил неверную информацию через форму, ломанулся в закрытый раздел или когда падает база, НУ ОЧЕНЬ большое значение играет 0.02 секунды, затраченное на скрипт.
    Что до как применять- это как в основном с ооп - в маленьких проектах сложно понять, но вот в больших становится ясно- Со всеми if else и своими функциями типо error_alert() - ты запутаешься, рано или поздно.
    + полезно

    http://habrahabr.ru/blogs/php/30399/
    http://habrahabr.ru/blogs/php/99431/

    http://habrahabr.ru/blogs/programming/119016/


     
  8. psn

    psn

    Регистр.:
    30 апр 2009
    Сообщения:
    227
    Симпатии:
    30
    "бред незнающих", а будет вам известно что 0,02 секунды это довольно большое время (имеется ввиду системное) и как у меня написано выше, при частом использовании это время тупо умножается на количество раз (выброс исключение не означает прекращении выполнения кода), вы кем работаете уважаемый, что делаете вывод о знающих и не знающих и где увидели бред? Каким образом запутаетесь с if рано или поздно :) откуда такое утверждение, сама формулировка в начале о единой инструменте и рекомендация к использовании так как без этого никуда мне говорит о том, что не знающий все таки вы...
     
  9. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    890
    Симпатии:
    558
    Я имел ввиду что отказываться от исключений или критиковать их потому что они медлительны - это глупо. Я как раз имею ввиду что это инструмент, и как всякий инструмент должен применяться там где нужно и как нужно.

    Термин "бред незнающих" - это значит что человек который хоть и что-то понимает в преимуществах и недостатках того или иного метода, делает выводы только на недостатках того, что ему не нравится. к примеру то же Исключение- оно медленное и генерирует кучу инфы, которая не нужна всегда за исключением масштабных ошибок вроде в sql запросах (очень часто достаточно одного текста).
    Но по сравнению с общим трафиком, который будет на сайте, трафик ошибок, которые будут должны вызывать исключение - в разы меньше.
    Такое относится к некритичным допускам- хуже работает, возможно. это критично- нет. стоит ли забыть про это- нет, просто стоит принимать во внимание.
    Я согласен с вашим всеведущим постом, с постом на хабре - Исключение, это прежде всего обработка значительной ошибки.
    Исключения можно приписать к ооп. А ооп- это вечный холивар)
    В контексте ХелооВолрд- конечно не запутаешься. Если ты очень умелый кодер который продумал изначально всю архитектуру системы вместе с последующими её модернизациями- то тоже запутаться нельзя будет. Но дело в том, что нам постоянно нужно что-то исправлять и дополнять, при разрастании проекта это делать всё будет сложнее и сложнее.
     
  10. psn

    psn

    Регистр.:
    30 апр 2009
    Сообщения:
    227
    Симпатии:
    30
    о том, почему лишний раз не надо использовать исключение - один из вопросов на собеседовании и речь не только о пхп... что вы подразумеваете под серьезным проектом. я не знаю не одного движка, где бы их использовали (возможно во фремворках, но я их не разу не использовал), а крупные проекты, которые держат большие нагрузки либо пишут не на пхп, либо учитывают каждую миллисекунду...