За последние 24 часа нас посетили 59264 программиста и 1841 робот. Сейчас ищут 911 программистов ...

Неймспейсы и вывод ошибок

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

  1. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Пришлось сейчас подключить такую библиотеку к сайту через Composer. Проблема в том, что при любой ошибке в этой библиотеке, она роняет мне сайт примерно с такой стеной текста. Если скормить ей 127.0.0.1 или ip которого нет в базе или просто неправильный ip.

    [​IMG]

    Как я использую эту библиотеку. Composer у меня установлен в проект локально.
    PHP:
    1. require_once(ABSPATH.'/vendor/autoload.php');
    2. use GeoIp2\Database\Reader;
    3. function get_body_classes() {
    4.     $body_classes = ''; // default
    5.     $reader = new Reader(ABSPATH.'/vendor/geoip2/share/GeoLite2-City.mmdb');
    6.     if ($reader) {
    7.         if ($_SERVER['HTTP_X_REAL_IP']) {
    8.            $ip = $_SERVER['HTTP_X_REAL_IP'];
    9.         } else {
    10.            $ip = $_SERVER['REMOTE_ADDR'];
    11.        }
    12.        $record = $reader->city($ip);
    13.        if ($record) {
    14.             $distr = $record->mostSpecificSubdivision->name;
    15.            $city = $record->city->name;
    16.      
    17.             if (($distr != 'Moscow') and ($city != 'Moscow')) {
    18.                 $body_classes = 'not-moscow';
    19.            }
    20.         }
    21.     }
    22.     return $body_classes;
    23. }
    Я копался в коде, смотрел как выводятся ошибки - там всё на неймспейсах, в которых я абсолютно не шарю. Сразу обозначу, что я тупой, чтобы ко мне не было притензий. Итак, вот как примерно выводятся ошибки в плагине:

    PHP:
    1. throw new AddressNotFoundException("The address $ipAddress is not in the database.");
    Если докапываться до сути, то все подобные вызовы стекаются к этому файлу:
    \vendor\geoip2\geoip2\src\Exception\GeoIp2Exception.php
    со следующим содержимым:
    PHP:
    1. <?php
    2.  
    3. namespace GeoIp2\Exception;
    4.  
    5. /**
    6. * This class represents a generic error.
    7. */
    8. class GeoIp2Exception extends \Exception
    9. {
    10. }
    Я так понимаю, что сюда можно дописать свой кастомный вывод ошибки. Как мне это сделать? И как вообще игнорировать все ошибки, которые выводятся обращением к этому классу?
     
  2. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  3. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Строку где создается объект ридера можно в буфер кинуть, а после уже к примеру сохранять лог, если по скорому. А так, смотреть нужно этот объект и исправлять косяк
    Ну или где он там ругается
     
  4. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
  5. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    именно так, гугли каждую функцию и все получится
     
    Nerfed нравится это.
  6. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Nerfed что находится в строке 153 ?
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @Nerfed, прочитай сначала про классы. Никакого отношения к composer это исключение не имеет. Любое брошенное исключение можно поймать и обработать, почитай ссылку от @romach. В библиотечные классы ничего дописывать не нужно.
     
  8. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @askanim Примерно такое, только текст ошибки другой.
    PHP:
    1. throw new AddressNotFoundException("The address $ipAddress is not in the database.");
    По итогу, оно всё приходит к
    PHP:
    1. class GeoIp2Exception extends \Exception
    Мне надо почитать то что @romach кинул, просто не успел пока.
    Вот это вообще для меня дичь пока. С классами всё понятно, ты можешь унаследовать класс и переопределить некоторые методы. Но как это в неймспейсах делается, я пока хз. Попробую разобраться вечером.
     
  9. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    @romach @mkramer Я тут залил упрощённый пример. Кто-нибудь сможет за тыщу рэ сделать готовое решение с комментами? Нужен репетитор кароч, потому как я уже писал, что я тупой, и чтение того что скинул romach мне не помогло. Не понимаю я как пользоваться исключениями. Благо, в наше время можно купить знания напрямую. Через буфер кстати тоже не получилось, скрипт всё-равно падает. Да и буфер это костыль, а хочется постичь дзен и научиться делать правильно. Ещё хочется научиться не следить грязными ногами в библиотеках, которые подтягивает Composer, так что если эту задачу возможно сделать без правок в библиотеке, было бы вообще шикарно.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @Nerfed
    PHP:
    1. try {
    2.      $record = $reader->city($ip);
    3.        if ($record) {
    4.             $distr = $record->mostSpecificSubdivision->name;
    5.            $city = $record->city->name;
    6.      
    7.             if (($distr != 'Moscow') and ($city != 'Moscow')) {
    8.                 $body_classes = 'not-moscow';
    9.            }
    10.         }
    11.     }
    12. } catch (\Exception $e) {
    13.     $body_classes = "default-body-class"; // Город по IP определить не смогли
    14. }
    Давай свою тыщу :)
     
    Nerfed нравится это.
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.818
    Симпатии:
    1.333
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. use GeoIp2\Database\Reader;
    4.  
    5. error_reporting ( E_ALL );
    6.  
    7.  
    8. require 'vendor/autoload.php';
    9.  
    10. // определение геолокации
    11. $result = 'Moscow';
    12.  
    13. $reader = new Reader( 'vendor/geoip2/share/GeoLite2-City.mmdb' );
    14.  
    15. $ip = '127.0.0.1'; # $_SERVER['REMOTE_ADDR'];
    16.  
    17. try
    18. {
    19.     $record = $reader -> city( $ip );
    20.    
    21.     $distr = $record -> mostSpecificSubdivision -> name;
    22.     $city = $record -> city -> name;
    23.    
    24.     if ( !in_array ( 'Moscow', [ $distr, $city ], true ) )
    25.     {
    26.         $result = 'Not Moscow';
    27.     }
    28. }
    29. catch ( Throwable $e )
    30. {
    31.     $result = $e -> getMessage();
    32. }
    33.  
    34. echo $result;
    35.  
    36. $contents = ob_get_contents ();
    37.  
    38.  
    39. ?>
    40. <!DOCTYPE html>
    41. <html>
    42.     <head>
    43.         <meta charset="UTF-8">
    44.         <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    45.         <meta http-equiv="X-UA-Compatible" content="ie=edge">
    46.         <title>Document</title>
    47.     </head>
    48.     <body>
    49.         <?= $contents . PHP_EOL ?>
    50.         <br>
    51.         <br>
    52.         <p style="color: red">Скрипт не упал.</p>
    53.     </body>
    54. </html>
    --- Добавлено ---
    да е*аный в рот:D
     
    Nerfed нравится это.
  12. Nerfed

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

    С нами с:
    21 июл 2017
    Сообщения:
    186
    Симпатии:
    12
    Скинь карту и название банка в личку. :D
    Ещё будет шанс.)) Я ещё пол-любому буду тупить с неймспейсами и с фреймворками.
     
  13. AlexProg

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

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    Скинул? )

    P.S. Просто интересно...
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ага :)
     
    AlexProg нравится это.