+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: Не могу понять set_exception_handler

  1. #1
    coder garmayev is on a distinguished road
    Регистрация
    19.12.2013
    Адрес
    Irkutsk
    Возраст
    28
    Сообщений
    26
    Вес репутации
    5

    Question Не могу понять set_exception_handler

    имеется кусок кода:

    PHP код:
    set_exception_handler("ExceptionHandler");

    function 
    ExceptionHandler$e ) {
        
    error_log$e->getMessage$e->getFile$e->getLine );
    }

    spl_autoload_register( function ($className) {
        
    $data['template'] = "default";
        
    $lowClassName strtolower($className);
        if (
    file_exists('classes/'.$lowClassName.'.php')) {
            require(
    'classes/'.$lowClassName.'.php');
        } else {
            throw new 
    Exception("Error Loading Classfile $className"1);
        }
    } ); 
    Как я понимаю, функция set_exception_handler устанавливает новый обработчик исключений, которые появляются ПОСЛЕ его установки.

    В данном случае если из файла index.php попробовать загрузить класс SERTIAKS:SAD() /* Класс чисто для примера, набрал его наобум */, логгирования не происходит (), хотя если в конец кода вставить дополнительно throw new Exception("test exception");, то все отрабатывает как надо...

    Что я делаю не так?

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Moderator Куратор
    system architect
    Duncon is on a distinguished road Аватар для Duncon
    Регистрация
    10.10.2004
    Адрес
    Питер
    Сообщений
    1,968
    Вес репутации
    17

    По умолчанию Re: Не могу понять set_exception_handler

    echo 'вызов дошёл'; просто пропиши чтоб посмотреть доходит ли вызов и до какого места.. Попробуй отдельно register функцию прописать, возможно динамическую разваливает просто..
    [syntax=Delphi] [/syntax]

  4. #3
    coder garmayev is on a distinguished road
    Регистрация
    19.12.2013
    Адрес
    Irkutsk
    Возраст
    28
    Сообщений
    26
    Вес репутации
    5

    По умолчанию Re: Не могу понять set_exception_handler

    Цитата Сообщение от Duncon Посмотреть сообщение
    Попробуй отдельно register функцию прописать, возможно динамическую разваливает просто..
    Вот тут можно чуток подробнее? если вы говорите про функцию register_tick_function то я не совсем понимаю как ее использовать?

    По поводу первого пункта модифицировал код то такого состояния:

    PHP код:
        set_exception_handler("ExceptionHandler");

        function 
    ExceptionHandler$e ) {
            echo 
    'ExceptionHandler<br>';
            
    error_log$e->getMessage().' in file '.$e->getFile().' in line '.$e->getLine() );
            require (
    'classes/error.php');
            
    Error::error404( array('template'=>'default''message'=>$e->getMessage() ) );
        }

        
    spl_autoload_register( function ($className) {
            
    $data['template'] = "default";
            
    $lowClassName strtolower($className);
            if (
    file_exists('classes/'.$lowClassName.'.php')) {
                require(
    'classes/'.$lowClassName.'.php');
            } else {
                echo 
    'failed autoloader<br>';
                throw new 
    Exception("Error Loading Classfile $className"1);
            }
        } ); 
    В ответ получаю на странице
    failed autoloader
    Error Loading Classfile SERTIAKS
    Последний раз редактировалось garmayev; 30.05.2017 в 16:37.

  5. #4
    Moderator Куратор
    system architect
    Duncon is on a distinguished road Аватар для Duncon
    Регистрация
    10.10.2004
    Адрес
    Питер
    Сообщений
    1,968
    Вес репутации
    17

    По умолчанию Re: Не могу понять set_exception_handler

    Код php:
    1. function my_autoloader($className) {
    2.         $data['template'] = "default";
    3.         $lowClassName = strtolower($className);
    4.         if (file_exists('classes/'.$lowClassName.'.php')) {
    5.             require('classes/'.$lowClassName.'.php');
    6.         } else {
    7.             echo 'failed autoloader<br>';
    8.             throw new Exception("Error Loading Classfile $className", 1);
    9.         }
    10. }
    11. spl_autoload_register('my_autoloader');
    [syntax=Delphi] [/syntax]

  6. #5
    coder garmayev is on a distinguished road
    Регистрация
    19.12.2013
    Адрес
    Irkutsk
    Возраст
    28
    Сообщений
    26
    Вес репутации
    5

    По умолчанию Re: Не могу понять set_exception_handler

    Цитата Сообщение от Duncon Посмотреть сообщение
    Код php:
    1. function my_autoloader($className) {
    2.         $data['template'] = "default";
    3.         $lowClassName = strtolower($className);
    4.         if (file_exists('classes/'.$lowClassName.'.php')) {
    5.             require('classes/'.$lowClassName.'.php');
    6.         } else {
    7.             echo 'failed autoloader<br>';
    8.             throw new Exception("Error Loading Classfile $className", 1);
    9.         }
    10. }
    11. spl_autoload_register('my_autoloader');
    то же самое. Никаких изменений на выхлопе нет.
    т.е. автолоад сам по себе работает нормально. Меня волнует проблема с исключением. Почему ф-ия ExceptionHandler срабатывает странным образом - из функции my_autoloader логи/эхо не пишутся, а если прописать напрямую в конец этого файла вызов исключения, то все пишется так, как нужно, и эхо, и логи

  7. #6
    Moderator Куратор
    system architect
    Duncon is on a distinguished road Аватар для Duncon
    Регистрация
    10.10.2004
    Адрес
    Питер
    Сообщений
    1,968
    Вес репутации
    17

    По умолчанию Re: Не могу понять set_exception_handler

    В мануле написано, что поcле вызова выполнение будет остановлено.. Может через set_error_handler решать эту задачу. К томуж зачем вызывать исключения? Если можно просто error_log('Класс не загрузился '.$className); прописать? Зачем вообще писать в лог, о том что класс не загрузился? Несколько дней и файл будет весить от пары метров до несколько гигов при активном пользовании..
    [syntax=Delphi] [/syntax]

  8. #7
    coder garmayev is on a distinguished road
    Регистрация
    19.12.2013
    Адрес
    Irkutsk
    Возраст
    28
    Сообщений
    26
    Вес репутации
    5

    По умолчанию Re: Не могу понять set_exception_handler

    Цитата Сообщение от Duncon Посмотреть сообщение
    К томуж зачем вызывать исключения? Если можно просто error_log('Класс не загрузился '.$className); прописать?
    Может я не прав, но мне кажется, что наиболее правильной будет обработка важных моментов работы системы через оператор
    PHP код:
    try {
    // Some code
    } catch ( Exception $e ) {
    // Some code
    }. 
    Цитата Сообщение от Duncon Посмотреть сообщение
    Зачем вообще писать в лог
    По моей задумке, должна выводится специальная страница с ошибкой (без участия htaccess), сформироваться письмо администратору сайта со всеми необходимыми переменными, которые привели к краху системы. Лог - это чисто на стадии разработки. В ситуации проблема с собственной обработкой исключения

    Цитата Сообщение от Duncon Посмотреть сообщение
    Несколько дней и файл будет весить от пары метров до несколько гигов при активном пользовании..
    система пишется не для заказчика, а для себя. Отсюда желание вести полный контроль и максимально исключить непредвиденные ошибки

    Цитата Сообщение от Duncon Посмотреть сообщение
    В мануле написано, что поcле вызова выполнение будет остановлено..
    После выброса исключения? Но ведь как раз для этого и была введена эта функция, не? Для обработки этого исключения.

  9. #8
    coder garmayev is on a distinguished road
    Регистрация
    19.12.2013
    Адрес
    Irkutsk
    Возраст
    28
    Сообщений
    26
    Вес репутации
    5

    По умолчанию Re: Не могу понять set_exception_handler

    Так и не понял в чем проблема, но только что система заработала так, как я этого добивался уже несколько дней...

    Цитата Сообщение от Алиса(Алиса_в_стране_чудес)
    Все становится чудесатее и чудесатее...
    Последние действия:
    1. Вынес обработку исключения в индексный файл
    2. Перезагрузил страницу - Работает
    3. вернул обработку на СТАРОЕ место
    4. Перезагрузил страницу - РАБОТАЕТ!

    осталось только понять в чем была ситуевина...

  10. #9
    Moderator Куратор
    system architect
    Duncon is on a distinguished road Аватар для Duncon
    Регистрация
    10.10.2004
    Адрес
    Питер
    Сообщений
    1,968
    Вес репутации
    17

    По умолчанию Re: Не могу понять set_exception_handler

    try { } catch - вообще не использую, не вижу смысла. В системном программировании он есть..
    Пойми php имеет нормальную встроенную систему ошибок, он сам пишет в файл с указанием конкретной строчки кода в файле, от куда произошла ошибка.. В местах где сам обрабатываешь пишешь просто error_log('Произошла ошибка такая-то, вот запрос вызвавший ошибку..'); Под твою задачу остаётся только поставить робота который будет периодически находить error_log в папках на сервере и отсылать письмо счастья, дальше включай воображение - можно целиком отослать, можно обработать как тебе удобней.. По факту отдельную систему обработки ошибок обычно не делают (редко встречается). И это лишняя нагрузка на сервер.. Проще код нормально написать без ошибок.. Стоит опасаться ошибок не в коде, а в логике программ, они куда серьёзнее и не регистрируются как ошибки..

    Мануал почитай внимательно, функций обработки ошибок несколько, выбирай исходя из своих задумок.. В повседневной жизни использую наверное <5% от возможностей php и это даёт мне возможность решать 100% задач, в дебри типа перебинживания ошибок вообще не лезу..
    [syntax=Delphi] [/syntax]

  11. #10
    Administrator Админ
    system architect
    AiK is on a distinguished road Аватар для AiK
    Регистрация
    13.02.2004
    Адрес
    СПб
    Сообщений
    2,297
    Вес репутации
    80

    По умолчанию Re: Не могу понять set_exception_handler

    try { } catch - вообще не использую, не вижу смысла.
    Смысл простой - продолжение работы скрипта при возникновении критической ошибки.

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

+ Ответить в теме
Страница 1 из 2
1 2 ПоследняяПоследняя

Похожие темы

  1. массивы.не могу понять какая ошибка...(
    Б4-3. Дана матрица 5х5. Для данного натурального М найти сум- му тех элементов матрицы, сумма индексов которых равна М. При выполнении заданий...
    от A_L_E_N_K_A в разделе Ассемблер
  2. не могу понять с какой стороны грамотно подступиться...
    Помогие переделать строчку данного кода под стандарт дом. В фрейме просто содержиться текст. Я что-то никак не могу понять — ведь фрейм же не...
    от WEB_bobby в разделе JScript, VBScript, DHTML...
  3. Не могу понять
    подскажите, что не так,:( :confused: Дана последовательность целых чисел. Найти наибольший и наимень¬ший из номеров ее членов, попавших в заданный...
    от EgorX в разделе Delphi и Pascal
  4. Помогите,не могу понять.
    procedure TForm1.FormCreate(Sender: TObject); var put:string; begin put:=edit1.text; assignFile(f1,put); assignFile(f2,'c:\1.txt'); reset(f1);...
    от oif в разделе Delphi и Pascal
  5. Не могу понять код чужого скрипта
    Вот скрипт: http://www.lemonhost.net/features/whois/mwhois.php Вот его код: <?php // include the config file require "config.php";
    от Ice_sCream в разделе Perl, PHP, ASP ...

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения