За последние 24 часа нас посетили 37715 программистов и 3299 роботов. Сейчас ищут 1462 программиста ...

Польза exception?

Тема в разделе "PHP для новичков", создана пользователем виталий032, 17 окт 2017.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Вообщем, решил разобраться, что такое выброс ошибок, посмотрел вот этот код:
    PHP:
    1. <?php
    2. error_reporting ( E_ALL );
    3. if ( version_compare ( PHP_VERSION, '7.1.0', '<' ) )
    4. {
    5.     die ( 'Error: Please, update module PHP ver ' . PHP_VERSION . ' ver < 7' );
    6. }
    7. class View
    8. {
    9.     protected
    10.         $a = [],
    11.         $template;
    12.  
    13.     public function assign( string $name, int $value )
    14.     {
    15.         if ( isset ( $this -> a[$name] ) )
    16.             throw new Exception( sprintf ( 'Заданное имя %s уже существует', $name ) );
    17.      
    18.         $this -> a[$name] = $value;
    19.      
    20.         return $this;
    21.     }
    22.     public function template( string $s )
    23.     {
    24.         $this -> template = $s;
    25.      
    26.         return $this;
    27.     }
    28.     public function output()
    29.     {
    30.         if ( empty ( $this -> template ) )
    31.             throw new Exception( 'Шаблон не задан' );
    32.      
    33.         $string = '';
    34.      
    35.         foreach ( $this -> a AS $name => $val )
    36.         {
    37.             $string .= sprintf ( $this -> template, $name, $val ) . '<br>';
    38.         }
    39.      
    40.         return $string;
    41.     }
    42.     public function __toString()
    43.     {
    44.         return $this -> output();
    45.     }
    46. }
    47. ( $view = new View )
    48.     -> assign( 'kentkent7', 12 )
    49.     -> assign( 'mkramer', 708 )
    50.     -> assign( 'виталий032', 15 )
    51.     -> assign( 'MouseZver', 1 )
    52.     -> template( 'Школьник %s, ему %d лет' );
    53. $lalki = $view -> output();
    54. echo "ТУТ ВСЕ ЛАЛКИ:<br>{$lalki}";
    55. /* или */
    56. //echo $view;
    Есть ли преимущества у thow new Exception() ?

    Ведь можно было сделать, например, вот так (кусок):
    PHP:
    1. public function assign( string $name, int $value )
    2.     {
    3.         if ( isset ( $this -> a[$name] ) )
    4.         {
    5.             print_r(sprintf ( 'Заданное имя %s уже существует', $name ) );
    6.         }
    7.         else
    8.         {
    9.             $this -> a[$name] = $value;
    10.             return $this;
    11.         }
    12.      
    13.     }
     
  2. Griffter

    Griffter Новичок

    С нами с:
    27 сен 2017
    Сообщения:
    92
    Симпатии:
    25
    Есть, и очень большое. Я бы посоветовал ознакомится с исключениями и использовать их в дальнейшем.
    "Выбросить" исключение и выдать сообщение через echo/print - это не одно и тоже...
     
  3. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    @Griffter расскажите в чем разница)) в любом случае обычно в скриптах прячут отображение ошибок))
    одно дело отлавливать ошибки и писать их в лог скрипта, что бы потом админ скрипта не залазя в логи сервера мог посмотреть где какие ошибки возникали .. а другое дело а помощью исключений ловить ошибки и вываливать сообщение на экран)
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.821
    Симпатии:
    1.333
    Адрес:
    Лень
    убивает дальнейшее выполнение действий пхп и выводит текст с трассировкой - где произошла бомбежка
     
  5. Griffter

    Griffter Новичок

    С нами с:
    27 сен 2017
    Сообщения:
    92
    Симпатии:
    25
    Так а я и не говорил, чтобы исключения вываливали на экран. Я сказал что:
    PHP:
    1. throw new Exception( sprintf ( 'Заданное имя %s уже существует', $name ) );
    и
    PHP:
    1.  print_r(sprintf ( 'Заданное имя %s уже существует', $name ) );
    Это не одно и тоже.
     
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    почему убивает?? вроде код дальше идет..

    PHP:
    1. <?php
    2. function inverse($x) {
    3.     if (!$x) {
    4.         throw new Exception('Деление на ноль.');
    5.     }
    6.     return 1/$x;
    7. }
    8.  
    9. try {
    10.     echo inverse(5) . "\n";
    11.     echo inverse(0) . "\n";
    12. } catch (Exception $e) {
    13.     echo 'Выброшено исключение: ',  $e->getMessage(), "\n";
    14. }
    15.  
    16. // Продолжение выполнения
    17. echo "Hello World\n";
    18. ?>
    Результат выполнения данного примера:
    Код (Text):
    1. 0.2
    2. Выброшено исключение: Деление на ноль.
    3. Hello World
    https://php.ru/manual/language.exceptions.html
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Исключение, в ряде случаев, позволяет просто писать код без миллиарда проверок, но с пачкой обработчиков на случай, если что-то случится. Всего не предугадать, всяко бывает. В php они не настолько ощутимы как польза. А вот на десктопе...

    Вот прикинь, запустил ты в продакшен приложение. И оно работает у каждого пользователя индивидуально. Ты не можешь, сидя у себя дома найти баг, выпилить его, накатить апдейт на сервер его и вуаля, у всех новая версия. Хрентотам. И все предвидеть не можешь. Но, зато, можешь обернуть все критические места кода в кэтчи, благодаря которым можно даже вернуть ситуацию в свои руки. Тут как бы выбор - либо приложение падает на ровном месте, либо у него есть шанс разобраться в ошибке и продолжить работу.
     
    виталий032 нравится это.
  8. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Спасибо за пример! Теперь понятно.

    Алекс8, не выполняется дальше. Вот например, не возвращает переменную $text
    PHP:
    1. <?php
    2.  
    3. class unit
    4. {
    5.     public function exist()
    6.     {
    7.         if(1 == 1)
    8.             throw new Exception('Блин');
    9.  
    10.         $text = 'It works';
    11.         return $text;
    12.     }
    13.  
    14.     public function __construct()
    15.     {
    16.         $text = $this->exist();
    17.         echo $text;
    18.     }
    19. }
    20.  
    21. $undefined = new unit;
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.821
    Симпатии:
    1.333
    Адрес:
    Лень
    ясен перец в ловушку поймал тру катч
    --- Добавлено ---
    у тебя возвращает блины
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Главное преимущество (которое @Fell-x27 вскользь немного указал) - это то, что обработчик исключения может быть намного выше по стеку вызовов, чем функция, выкинувшая исключение.
    PHP:
    1. class SomeExceptionClass extends Exception {/* .... */};
    2. function f1() {
    3.    if (error()) throw new SomeExceptionClass("error");
    4.    /* куча кода */
    5. }
    6.  
    7. function f2() {
    8.      f1();
    9. }
    10.  
    11. function f3() {
    12.     f2();
    13. }
    14.  
    15. function f4() {
    16.    f3();
    17. }
    18.  
    19. try {
    20.     f4();
    21. } catch (SomeExceptionClass $e) {
    22.     /* Do something with this error */
    23. }
    С кодами ошибок такое не пройдёт, пришлось бы на каждом уровне проверять. А, особенно при ООП, стек вызовов в реальном проекте может очень глубоко опуститься.
     
    #10 mkramer, 17 окт 2017
    Последнее редактирование: 17 окт 2017
    Fell-x27 и Алекс8 нравится это.
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да, про всплытие следовало бы сразу сказать чуть подробнее, сорян.
     
  12. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    растолкуйте про всплытие.. что такое стек вызовов я знаю.. учили когда то, но что в этом случае "всплытие" не могу понять..
    стек вызовов это грубо говоря запоминание в какую функцию ушло приложение..
    а зачем тут чему то всплывать?))
    Спасибо)
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Это так называется то, что я описал. После выбрасывания исключения интерпретатор будет раскручивать стек вызовов в обратном порядке, пока не найдёт обработчик. Из всех остальных функций будет автоматический немедленный выход