Пополнение FAQ: Обработка ошибок программистами и обработка сообщений об ошибках...

Popoff

popoff.donetsk.ua
Пополнение FAQ: Обработка ошибок программистами и обработка сообщений об ошибках...

Вот, собственно:
http://phpclub.ru/faq/ErrorHandling

Интересует в первую очередь мнение тех людей, которые принимали участие в оригинальном топике. Всё ли мнения я учёл, ни кого не обидел ли?

Мнения знающих людей также были бы интересны.

Предложения по сокращению статьи без потери информации и по улучшению читаемости статьи с радостью приветствуются.
 

camka

не самка
Сам сталкивался с такой проблемой:
PHP:
@$array[$key1][$key2] = get_something();
Поскольку ключи как внешнего, так и вложенного элементов массива были заранее неинициализированы, а проверять их на существование было лень, использовал собаку. В итоге, оказалось, что собака подавила не только ошибку обращения к несуществующей переменной, но и полностью все ошибки, возникающие в вызываемой функции get_something().
 

svetasmirnova

маленький монстрик
На тему собачников.
Я тут бенчмарку делала, после того, как долго искала ошибку в поддерживаемом коде и нашла её, после того, как убрала собаку из такого:
PHP:
$this->value = (int)@$_GET['value'];
Результат можете сами посмотреть:
PHP:
<?php

$t1 = microtime(true);
//исходный вариант: $a['b'] не существует
for ($i = 0; $i < 10000; $i ++) {
	$x = (int)@$a['b'];
}

$t2 = microtime(true);
//просто isset
for ($i = 0; $i < 10000; $i ++) {
	$x = (isset($a['b']) ? (int)$a['b'] : null);
}

$t3 = microtime(true);
//для удовлетворения паранойи: добавляем ещё одну проверку
for ($i = 0; $i < 10000; $i ++) {
	$x = ((isset($a['b']) && is_numeric($a['b'])) ? (int)$a['b'] : null);
}

$t4 = microtime(true);
//повторим для чистоты эксперимента
for ($i = 0; $i < 10000; $i ++) {
	$x = (int)@$a['b'];
}

$t5 = microtime(true);

echo ($t2 - $t1) . '---' . ($t3 - $t2) . '---' . ($t4 - $t3) . '---' . ($t5 - $t4) . "\n";

?>
 

Andreika

"PHP for nubies" reader
Есть мнение, что такой код:
$action=null;
if(isset($_GET['action'])) $action=$_GET['action'];
длинее, непонятнее и хуже, чем такой:
$action=@$_GET['action'];

но на самом деле это не так - верхний код короче, понятнее и лучше :)))))))

camka
Поскольку ключи как внешнего, так и вложенного элементов массива были заранее неизвестены, а проверять их на существование было лень, использовал собаку.
довольно интересная система.. ладно б
$a = $arr[$b][$c].. но в чем смысл присвоения результата выполнения функции по сути пустоте?
 

camka

не самка
довольно интересная система.. ладно б
$a = $arr[$b][$c].. но в чем смысл присвоения результата выполнения функции по сути пустоте?
Если это вопрос, то я его не понял
svetasmirnova
Потыркался в ваш пример, нашел интересную особенность: если убрать фигурные скобки в цикле foreach то скорость заметно увеличится (заметно - не значит значительно). Это, однако, не значит, что везде, где возможно, следует избавляться от фигурных скобок, жертвуя удобочитаемостью кода, да и вообще ничено не значит; так, для информации. Похоже, что лишняя низкоуровневая инструкция выполняется при их присутствии. Занятно.
 

Andreika

"PHP for nubies" reader
(изменю лучше текст, а то опять не дойдет)

camka
в общем интересует кусок кода в котором
левая часть (до "=") от
PHP:
$array[$key1][$key2] = get_something();
выдаст нотис/ошибку, но при этом реализованный в коде алгоритм имеет смысл
 

SelenIT

IT-лунатик :)
Popoff
Маленькое замечание по ссылке на тест - там не 4-я версия случайно?
 

camka

не самка
Andreika
Вру. В оригинале было такое
PHP:
@$array[$key1][$key2] .= get_something();
 

Andreika

"PHP for nubies" reader
camka
о! ) ну наконец-то первый пример осмысленного применения @ и наличия проблем с ним :)
 

svetasmirnova

маленький монстрик
Popoff
>Четвёртая :)
Результаты, кстати, схожие, но см. описание [m]microtime[/m]
 

Popoff

popoff.donetsk.ua
svetasmirnova
SelenIT
хи-хи :) По идее у меня должны были выскакивать отрицательные значения, но не выскакивали :)
 
Никогда не используйте в Ваших программах функцию eval. Использование этой функции значительно увеличивает шансы Ваших скриптов на подверженность РНР-инъекциям.
Предлагаю добавить еще и:
Никогда не используйте в Ваших программах функцию mysql_query. Использование этой функции значительно увеличивает шансы Ваших скриптов на подверженность SQL-инъекциям. :)

вместо
PHP:
$action=null;
if(isset($_GET['action'])) $action=$_GET['action'];
лучше так:
PHP:
$action = isset($_GET['action']) ? $_GET['action'] : null;
 

Popoff

popoff.donetsk.ua
Алексей Пешков
Фраза насчёт функции eval - для тех, кто использует эту функцию там, где её использовать не нужно. А таких - много.

Насчёт второго замечания согласен.
 

SelenIT

IT-лунатик :)
Popoff
>...должны были выскакивать отрицательные значения, но не выскакивали :)

Выскакивали, просто минус сливался с тремя другими, которые разделитель :)
 

Popoff

popoff.donetsk.ua
Гравицапа
На ту статью есть ссылка. Она имеет право на существование как отдельный документ: не много философских рассуждений, как у меня, а короткий сборник "за" и "против".
 
Сверху