За последние 24 часа нас посетили 70311 программистов и 1820 роботов. Сейчас ищут 354 программиста ...

Исключения

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

  1. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Попытался разобраться в исключениях, вроде всё понятно, но в тоже время и не понятно.

    Пример:

    PHP:
    1. <?php
    2.  
    3. function test($val){
    4.  
    5.     if (!empty($val)) {
    6.        
    7.         if (is_string($val)) {
    8.  
    9.             $strlen = strlen($val);
    10.  
    11.             if ($strlen == 10) {
    12.  
    13.                 return $val;
    14.  
    15.             }elseif($strlen > 10){
    16.  
    17.                 return false;
    18.  
    19.             }else{
    20.  
    21.                 return false;
    22.  
    23.             }
    24.  
    25.         }elseif (is_array($val)) {
    26.  
    27.             return false;
    28.  
    29.         }elseif (is_numeric($val)) {
    30.  
    31.             return false;
    32.  
    33.         }else{
    34.  
    35.             return false;
    36.  
    37.         }
    38.  
    39.     }else{
    40.  
    41.         return false;
    42.     }
    43.  
    44. }
    45.  
    46. ?>
    Мысль:

    На каждом "false" имею свою причину возникновения того или иного false и если мне нужно определить по какой же причине я на выходе получаю false, могу прописать echo с описанием причины, но если это готовый скрипт, было бы глупо показывать возникшие ошибки пользователю, хотя бы по той причине, что не всегда та или иная ошибка может зависеть от пользователя.
    Так вот ведь можно возле каждого такого "false" написать к примеру:

    PHP:
    1. function log($text){
    2.  
    3.     file_put_contents("log.dat", $text."\n");
    4.  
    5. }
    Вставлять эту функцию в местах возникновения false и передавать туда текст проблемы, либо совместить эти 2 идеи:

    PHP:
    1. function log($text, $status = 0){
    2.  
    3.     if ($status == 0) {
    4.         file_put_contents("log.dat", $text."\n");
    5.     }else{
    6.         echo $text;
    7.     }
    8.  
    9. }
    В одном режиме указывать $status = 1 и выводить текст, либо писать в примитивный файл лога.

    Вот тут как раз вопрос:

    - Почему так, как написано выше делать не нужно?
    - Как правильно вести файл-лог ошибок.

    Спасибо!
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.234
    Симпатии:
    1.662
  3. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Это лишь пример, который демонстрирует возможность возникновения множественных исключений или такого априори быть не может?
    В книгах тоже показывают примеры, которые просты до безумия и далеки от реальных рабочих кодов.
    Исключения или исключительные ситуации это ведь не только возникшая проблема "Деление на ноль запрещено", но и какие-то рабочие моменты, касающиеся индивидуального разрабатываемого кода, которые в последующем могут породить ту или иную ошибку.
    Ведь перед каждым false можно прописать что-то типа
    PHP:
    1. throw new Exception('ПРИЧИНА');
    и всё обернуть в try и catch.
    --- Добавлено ---
    может вот так будет понятнее:

    PHP:
    1. <?php
    2.  
    3. header('Content-Type: text/html; charset=UTF-8');
    4.  
    5. function test($val){
    6.  
    7.     try{
    8.  
    9.         if (!empty($val)) {
    10.            
    11.             if (is_string($val)) {
    12.  
    13.                 $strlen = strlen($val);
    14.  
    15.                 if ($strlen == 10) {
    16.  
    17.                     return $val;
    18.  
    19.                 }elseif($strlen > 10){
    20.  
    21.                     throw new Exception('Больше 10');
    22.                     return false;
    23.  
    24.                 }else{
    25.  
    26.                     throw new Exception('Не равно 10');
    27.                     return false;          
    28.  
    29.                 }
    30.  
    31.             }elseif (is_array($val)) {
    32.  
    33.                 throw new Exception('Массив.');
    34.                 return false;
    35.  
    36.             }elseif (is_numeric($val)) {
    37.  
    38.                 throw new Exception('Число');
    39.                 return false;
    40.  
    41.             }else{
    42.  
    43.                 throw new Exception('Не определенная ошибка');
    44.                 return false;
    45.  
    46.             }
    47.  
    48.         }else{
    49.  
    50.             throw new Exception('EMPTY');
    51.             return false;
    52.         }
    53.     }catch (Exception $e) {
    54.         echo 'Выброшено исключение: ',  $e->getMessage(), "\n";
    55.     }  
    56.  
    57. }
    58.  
    59. echo test('zaqwertyui');
    60. echo test(10);
    61. echo test('wertyui');
    62. echo test([1,2,3]);
    63.  
    64. ?>
    --- Добавлено ---
    В чем существенное отличие между
    PHP:
    1. throw new Exception('тут текст');
    и тем, если я буду перед каждым return false выводить текст через echo ?
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.234
    Симпатии:
    1.662
    Ты можешь бросать исключения разных типов и при поимке разную реакцию давать:
    PHP:
    1. try {
    2.     функция();
    3. } catch (Трындец1 $e) {
    4.       /* Обработать трындец 1 */
    5. } catch (Трындец2 $e) {
    6.       /* Обработать трындец 2 */
    7. }  catch (\Exception $e) {
    8.      /* Обработать остальные трындецы, которые не перечислены выше */
    9. }
    + исключения раскручивают назад стек вызовов, пока не найдётся обработчик, поэтому можно ставить обработчик хоть на 100 уровней вызова выше
     
    AlexandrS нравится это.