Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Оптимизация error escaping


Автор: alexandra231525480 10.4.2008, 11:40
привет! как можно игнорить варнинги помимо @my_func() ? так как такая конструкция нехило тормозит код  она делает такое:
Код

<?php
$old = ini_set('error_reporting', E_NONE);
my_func();
ini_set('error_reporting', $old);

Автор: bars80080 10.4.2008, 11:58
можно исправить ошибки и никаких варингов не будет вообще

Автор: alexandra231525480 10.4.2008, 12:07
умно. только это не для кода, а для тестов

Автор: Fortop 10.4.2008, 12:13
не понял. Зачем?
И что собственно нужно сделать?

Добавлено через 57 секунд
Почему не написать свой обработчик ошибок?

Автор: bars80080 10.4.2008, 12:40
а зачем для тестов их игнорировать? их наоборот нужно выявлять всеми возможными способами

Автор: alexandra231525480 10.4.2008, 13:20
smile объясняю
есть код, есть на него тесты с плохими значениями, в случае , например, битого файла (недокаченного etc) код должен без разных ексепшинов просто вернуть false. а варнинги, которые мне об этом сообщают просто-напросто ломают тесты smile вот и надо их скипать! smile применение @func() юзает ini_set, что есть весьма плохо. ровно в 100 раз быстрее (только что протестила) вот такое:
Код

$old = error_reporting(0);
func();
error_reporting($old);

так шо наверно это и есть наиболее оптимальный вариант, чтоб скипать все эти какашки на участке кода..

Автор: WolfON 10.4.2008, 14:34
try catch ёпрст!

Автор: Fortop 10.4.2008, 15:01
Цитата(WolfON @  10.4.2008,  14:34 Найти цитируемый пост)
try catch ёпрст! 

Он не ловит ошибки, только Exception.
Т.е. нужен еще и свой обработчик ошибок, который будет принудительно кидать Exception

Автор: alexandra231525480 10.4.2008, 15:06
 smile  чуваки, я ж грила - никаких ексепшинов  smile 

Автор: alexandra231525480 10.4.2008, 15:48
во-первых, если твое решение просто не подходит человеку - нефиг гнать на его тесты и приложения.
во-вторых, если ты не понял вопроса также нефиг гнать на вопрошаемого
в-третих, @func использовалось в приложении. и я хочу избегать этот оператор. если не использовать вообще никаких скипов ошибок - валятся тесты. вот я и выдвинула пост дабы узнать мнения по поводу как можно подругому избегать варнингов и прочего подобного.

Добавлено через 2 минуты и 10 секунд
и как вообще могло взбрести в голову, что именно в тестах используется @ ??????

Автор: MoLeX 10.4.2008, 16:30

M
MoLeX
так, гонор сбавляем... не знаем - не говорим и не советуем...


Добавлено через 1 минуту и 10 секунд
а грубить - эт последние дело, и причем наказуемое

Автор: Fortop 10.4.2008, 17:17
Цитата(alexandra231525480 @  10.4.2008,  15:48 Найти цитируемый пост)
и как вообще могло взбрести в голову, что именно в тестах используется @ ?????? 


процитированное ниже можно было как-то воспринять иначе?
Цитата(alexandra231525480 @  10.4.2008,  11:40 Найти цитируемый пост)
привет! как можно игнорить варнинги помимо @my_func() ? так как такая конструкция нехило тормозит код  она делает такое:

Цитата(alexandra231525480 @  10.4.2008,  12:07 Найти цитируемый пост)
умно. только это не для кода, а для тестов 



Я уже не говорю про 
Код

$old = ini_set('error_reporting', E_NONE);

Который сам по себе генерирует ошибку.


Но, разницы для 
Код

$old = error_reporting(0);
func();
error_reporting($old);

33.961764574051с   940000 итераций   0.000036129536780905 среднее время

Код

@func()

17.399100780487с   1000000  итераций    0.000017399100780487 среднее время

Код

$old = ini_set('error_reporting', 'E_NONE');
func();
ini_set('error_reporting', $old);

40.267714977264с   1060000 итераций     0.00003798841035591 среднее время

Практически нет.

А вот, тот замечательный авторский код который тормозил smile
Код

$old = ini_set('error_reporting', E_NONE);
func();
ini_set('error_reporting', $old);

завершения его работы я не дождался в течении 10ти минут при 100% загрузке процессора

Сами догадаетесь почему? Или подсказать?

Еще вопросы к непрофессионалам будут?

Автор: Fortop 10.4.2008, 17:33
оно таки завершилось
Код

$old = ini_set('error_reporting', E_NONE);
func();
ini_set('error_reporting', $old);


2811.8342983723с   910000 итераций   0.0030899278004091 среднее время

Автор: alexandra231525480 10.4.2008, 18:29
почитай в манах - использование @ интерпретируется как 
Код

$old = ini_set('error_reporting', E_NONE);
func();
ini_set('error_reporting', $old);


и весь вопрос заключался в том - как этого избежать! вот и решение - error_reporting !

Добавлено через 4 минуты и 40 секунд
и в конечном итоге вместо 
Код

return @imagecopyresized($newImg, $imgRes, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $sourceWidth, $sourceHeight)


имеем
Код

return self::escapeErrorReporting('imagecopyresized', array($newImg, $imgRes, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $sourceWidth, $sourceHeight))

...

public static function escapeErrorReporting($callback, $paramsArray) {
        $oldErrorReporting = error_reporting(0);
        $result = null;
        try {
            $result = call_user_func_array($callback, $paramsArray);
        }catch (Exception $e) {
            $result = false;
        }
        error_reporting($oldErrorReporting);
        return $result;
    }

Автор: Fortop 10.4.2008, 19:03
Цитата(alexandra231525480 @  10.4.2008,  18:29 Найти цитируемый пост)
почитай в манах - использование @ интерпретируется как 
Выделить всёкод PHP
$old = ini_set('error_reporting', E_NONE);
func();
ini_set('error_reporting', $old);

Не соблаговолите ли указать прямой линк на такую трактовку?
Поскольку сам я всегда пользовался http://ua2.php.net/manual/ru/language.operators.errorcontrol.php

А теперь еще раз и вдумчиво читаем то, что написано ниже.

Для того чтобы не работало в 100 раз медленнее 
Надо
Код

$old = ini_set('error_reporting', 'E_NONE');


В коде автора
Код

$old = ini_set('error_reporting', E_NONE);


Все еще не понятно?
E_NONE вызывает NOTICE за счет чего и замедляется обработка!
Для просмотра предопределенных констант настоятельно рекомендую пользоваться следующим кодом 
Код

var_dump(get_defined_constants());



Цитата(alexandra231525480 @  10.4.2008,  18:29 Найти цитируемый пост)
и в конечном итоге вместо 
Код

return @imagecopyresized($newImg, $imgRes, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $sourceWidth, $sourceHeight)
имеем

Код

return self::escapeErrorReporting('imagecopyresized', array($newImg, $imgRes, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $sourceWidth, $sourceHeight))


Пожалейте мои мозги и сердце.

Автор: IZ@TOP 21.4.2008, 18:44
alexandra231525480, какими тестами пользуетесь? В UnitTest'ах все отлично работает - если эта ошибка запланированная; для того и придуман assertError.

Автор: ST_Falcon 22.4.2008, 22:33
Цитата(Fortop @  10.4.2008,  19:03 Найти цитируемый пост)
Пожалейте мои мозги и сердце. 

+1  smile 

alexandra231525480, 
Цитата

умно. только это не для кода, а для тестов 

Цитата

и я хочу избегать этот оператор. если не использовать вообще никаких скипов ошибок - валятся тесты. вот я и выдвинула пост дабы узнать мнения по поводу как можно подругому избегать варнингов и прочего подобного.

зачем? в тестах проблема с производительностью или что? 

@ стандартный оператор подавления ошибок. менять его на другую конструкцию считаю не логичным - во первых не читабельно, во вторых быстрее работать не будет (как уже вам указали выше). 

ps. тема очень похожа на стёб smile

Автор: Fortop 23.4.2008, 01:46
Цитата(ST_Falcon @  22.4.2008,  22:33 Найти цитируемый пост)
зачем? в тестах проблема с производительностью или что? 

У нее проблема с умением писать тесты.

Вместо того, чтобы бросать Exception и проверять в тесте именно наличие нужного Exception, она пытается подавить вообще все ошибки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)