Мой любимый ошибки программирования

За мою карьеру программирования, я сделал много ошибок на нескольких языках.

В самом деле, если я пишу 10 или более строк кода, и он работает в первый раз, я получу немного подозрительным и протестировать его более тщательно, чем обычно.Я бы ожидать, чтобы найти ошибки синтаксиса или плохо ссылкой массива или неправильно переменная или something.

Мне нравится, чтобы классифицировать эти ошибки на три большие группы: петух окна (или провалы в американском английском), ошибки и упущения.Член-вверх, когда вы безучастно смотреть на экран и прошептать: “Oops”: такие вещи, как удаление баз данных или веб-сайт или перезаписи трех дней стоит работа, или случайно по электронной почте people.__3 20000 |

Mwnt beach
береговой линии около МНТ на западном побережье Уэльса.Читайте дальше, чтобы выяснить, почему это находится на полпути к тому, особый place.

Ошибки охватывает все, от простых синтаксических ошибок, как забыв } к фатальным ошибкам и вычислительных ошибок.При возникновении ошибки настолько тонкие и трудно найти, что это почти красивым, я бы назвал его надзором.Это происходит, когда блок кода, вынуждены обращаться совершенно непредвиденным и очень маловероятно стечение обстоятельств.Она заставляет вас сидеть сложа руки и думать: “Wow”: как видим яркую радугу или падающую звезду, за исключением чуть менее романтические и не так впечатляет, когда описанные в one’ с партнерами над свечой dinner.

Эта статья обсуждает некоторые из захватывающих и красивых ошибки, которые я сделал, и уроки, извлеченные из них.Последние три моих favorites.

Выход режиме отладки On

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

Когда я впервые начал фриланс, я написал набор библиотек PHP для обработки запросов к базе данных, форм и шаблонов страниц.Я построил режиме отладки в библиотеках на достаточно глубоком уровне, которые зависят от глобальных переменных называется $DEBUG.

Я также хранится локальная копия всех основных веб-сайте я работал, для разработки, отладки и тестирования.Таким образом, когда возникла проблема, я мог бы положить $DEBUG=1; в верхней части страницы, и она рассказывала мне разные вещи, например, все базы данных заявлений было работать.Я редко использовал этот метод отладки на живых сайтах, это было для локального использования only.

За исключением одного дня, когда я работал поздно ночью, отладки незначительные проблемы на популярный сайт электронной коммерции.Я ставлю $DEBUG=1; в верхней части несколько страниц и была переключения между ними.Это было все устали размытия полночь, но в конце концов я как-то добавила отладки переменных к наиболее важная страница на сайте, тот после нажатия кнопки “Оплатить сейчас”, и я загрузил его в живых website.

На следующее утро я вышел рано на весь день.Я вернулся домой в 9:00 вечера, чтобы найти 12 болееразочарованных сообщений на автоответчике и многое другое писем.Около 20 часов, когда клиент нажатии платить, они увидели что-то вроде этого:

screenshot

Что клиенты видели, когда они нажали

Мне потребовалось около 10 секунд, чтобы исправить, но намного дольше, чтобы извиниться перед моим клиентом для day’ S стоит потерянных orders.

Уроки Learned

Я провел внутреннее расследование этого вопроса и установлено следующее:

  1. Избегать работы поздно ночью,
  2. Сделать полный порядок испытание, когда я внести изменения в обработке заказов, однако несовершеннолетнего;
  3. Убедитесь, что заявления отладки никогда не видят дневного света на живом сайте;
  4. Предоставление некоторых чрезвычайных контактную информацию для меня и / или резервные programmer.

Продуманный Debugging

Для Третье требование, я реализовано несколько функций, как это, чтобы убедиться, что отладочные сообщения выводятся только тогда, когда I ищу на сайте:

function CanDebug() {
 global $DEBUG;
 $allowed = array ('127.0.0.1', '81.1.1.1');
 if (in_array ($_SERVER['REMOTE_ADDR'], $allowed)) return $DEBUG;
 else return 0;
}
function Debug ($message) {
  if (!CanDebug()) return;
  echo '<div style="background:yellow; color:black; border: 1px solid black;';
  echo 'padding: 5px; margin: 5px; white-space: pre;">';
  if (is_string ($message)) echo $message;
  else var_dump ($message);
  echo '</div>';
}

Затем, когда я хочу вывести что-то для отладки, я называю Debug функции.Это требует CanDebug проверить запрашивающим адрес IP и $DEBUG переменной.$allowed массив содержит мой IP адрес для локального тестирования (127.0.0.1), и мой широкополосных IP-адрес, который я могу получить от WhatIsMyIPAddress.com.

Тогда я могу выводить такие вещи:

$DEBUG = 1;
Debug ("The total is now $total"); //about a debugging message
Debug ($somevariable); //output a variable
Debug ("About to run: $query"); //before running any database query
mysql_query ($query);

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

screenshot

Вывод отладки statements.

Для дополнительной безопасности, я мог бы также поместить сообщение об ошибке внутри HTML комментариев, но тогда я должен был бы просеять через HTML источник, чтобы найти немного, я искал for.

У меня есть другая полезная связанных немного кода, который я могу положить в верхней части страницы или файла конфигурации, чтобы убедиться, что все PHP уведомлений, предупреждений и ошибок будет показана мне и только мне.Если человек не я, то ошибки и предупреждения будут выводиться в журнал ошибок, но не отображаются на экране:

if (CanDebug()) {ini_set ('display_errors', 1); error_reporting (E_ALL);}
else {ini_set ('display_errors', 0); error_reporting (E_ALL & ~E_NOTICE);}

Debuggers

Выше метод является полезным для быстрого поиска ошибок в очень специфических битов кода.Существуют также различные инструменты отладки, такие как FirePHP и Xdebug, который может обеспечить огромное количество информации о сценарии PHP.Они также могут работать незаметно, выводит список всех вызова функции в лог-файл без выхода к user.

Xdebug могут быть использованы следующим образом:

ini_set ('xdebug.collect_params', 1);
xdebug_start_trace ('/tmp/mytrace');
echo substr ("This will be traced", 0, 10);
xdebug_stop_trace();

Это немногоКод регистрирует все вызовы функций и аргументы в файл / tmp/mytrace.xt, который будет выглядеть следующим образом:

screenshot

Содержание следов Xdebug стека показывает каждую функцию call.

Xdebug также отображает гораздо больше информации, когда есть PHP уведомления, предупреждения или ошибки.Тем не менее, она должна быть установлена ​​на сервере, так что это вряд ли возможно в большинстве живых хостинг environments.

FirePHP, с другой стороны, работает библиотека PHP, который взаимодействует с дополнение к Firebug, плагина для Firefox.Вы можете выходного трассировки стека и отладки информацию непосредственно из PHP в консоль Firebug — опять же, невидимой для user.

Для обоих этих методов, функций, как CanDebug выше по-прежнему полезны для убедившись, что не все с Firebug может просматривать трассировки стека или генерировать большие файлы журнала на server.

Включение режима отладки Off

Отладку сценариев по электронной почте является более активное участие.Окончательно тестирования ли скрипт отправки электронной почты должным образом трудно без фактического отправки электронной почты.Какой я когда-то сделал, mistake.

Несколько лет назад меня попросили создать массовую рассылку скрипт для отправки писем ежедневно более 20000 зарегестрированным пользователям.Во время разработки я использовал нечто похожее на CanDebug функции выше, так что я мог проверить по электронной почте сценарий без фактического отправки электронной почты.Функция для отправки писем посмотрел что-то вроде этого:

function SendEmail ($to, $from, $subject, $message) {
  if (CanDebug() >= 10) Debug ("Would have emailed $to:\n$message");
  else {
    if (CanDebug()) {$subject = "Test to $to: $subject"; $to = "test@test.com";}
    mail ($to, $subject, $message, "From: $from");
  }
}

Если я $DEBUG=1, он будет посылать сообщения электронной почты (все 20.000 из них) на тестовый адрес, чтобы я мог проверить.Если я $DEBUG=10, он скажет мне, что он пытался отправить по электронной почте, но на самом деле не написать anything.

Вскоре после запуска, возникла проблема со сценарием.Я думаю, что не хватило памяти от выполнения некоторых неэффективных обработки 20.000 раз.В какой-то момент, я вошел в что-то исправить, забыли установить мою $DEBUG переменной (или же мои широкополосных IP-адрес был изменен неудобно) и ошибочно по электронной почте people.__2 20000 |

Я извинился перед агентством Я работал, но к счастью ничего особенного не вышло.Я думаю, что спам-фильтры, их много сообщений.Или, возможно, получателями были просто рады, что письмо не содержит ничего для них сделать или read.

Уроки Learned

Я был очень рад, что я просто положил “тест” в теме и сообщения из теста электронной почты, а не какой-то заявление, отражающее как разочарование я получаю в данный ошибке.Я узнал несколько уроков:

  1. Будьте особенно осторожны при тестировании массовую рассылку сценариев — убедитесь, что режим отладки working.
  2. Отправить тестовых писем как несколько людей, как possible.
  3. Всегда отправлять вежливы тестовых сообщений, как Don__41 “не обращайте внимания, это проба”. | T сказать что-то вроде: “Мой клиент дурачок”, в случае, если он будет отправлен до 20.000 ничего не подозревающий investors.

PHP ПустойPage

Сейчас we’ повторно в области труднодоступных местах ошибок, а не член окон.Если you’ хотел бы видеть трудно отладки ошибка в PHP, похоронить следующие где-то глубоко в коде:

function TestMe() {TestMe();}
TestMe();

В зависимости от браузера и server’ с Apache и PHP версий, вы можете получить пустую страницу, “Эта веб-страница не доступна,” фатальной ошибкой из-за нехватки памяти или опцию “Сохранить”или “Открыть” страницы, например:

screenshot

бесконечную рекурсию, а занимается Firefox 3.6.

Это в основном вызывает бесконечную рекурсию, которая может вызвать поток веб-сервера для запуска из памяти и / или аварии.Если он выходит из строя, небольшой след может или не может быть оставлен в журнале ошибок:

[Mon Jun 06 18:24:10 2011] [notice] child pid 7192
  exit signal Segmentation fault (11)

Но это мало что дает указание, где и почему произошла ошибка.И все быстрые методы отладки добавления строк вывода здесь или там, возможно, не очень помогает, потому что, пока нарушителя код запускается на выполнение, то страница будет, похоже, не в полном объеме.Это главным образом потому PHP только периодически посылает он генерирует HTML в браузере.Таким образом, добавив много flush(); заявлений, по крайней мере показать вам, что ваш скрипт делает непосредственно перед рекурсивным error.

Конечно, код, который приводит к этой ошибке может быть гораздо более запутанным, чем выше.Это может включать в себя классы вызова методов в других классах, вернитесь в исходное классов.И это может произойти только в определенных трудно дублировать обстоятельствах и только потому, что you’ ве изменилось что-то еще где-то else.

Уроки Learned

  1. Знать расположение файла журнала ошибок, в случае, если что-то получает записанный there.
  2. Это где стек трассировки отладчиков, таких как Xdebug может быть действительно handy.
  3. В противном случае отложите достаточно времени, чтобы пройти через код строка за строкой, комментируя из битов, пока он works.

Неправильная переменная Type

Эта ошибка часто случается с базами данных.Учитывая следующий SQL заявления …

CREATE TABLE products (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(60),
  category VARCHAR(10),
  price DECIMAL(6,2)
);
INSERT INTO products VALUES (1, 'Great Expectations', 'book', 12.99);
INSERT INTO products VALUES (2, 'Meagre Expectations', 'cd', 2.50);
INSERT INTO products VALUES (3, 'Flared corduroys', 'retro clothing', 25);

… Вы можете догадаться, что возвращается, если вы выполните следующие

SELECT * FROM products WHERE category='retro clothing';

Ответ ничего, потому что колонке категории только 10 символов, и поэтому категория последнее произведение обрезается на retro clot.Последний раз редактировалось продукты или новые пункты меню внезапно исчезали может создать много путаницы.Но фиксации этого, как правило, очень проста:

ALTER TABLE products MODIFY category VARCHAR(30);
UPDATE products SET category='retro clothing' WHERE category='retro clot';

screenshot

категория была отрезана после 10 символов, как показано на phpMyAdmin.

Я сделал более серьезной ошибкой с первой крупной сайт электронной коммерции, над которым я работал.В конце процесса заказа, на сайте будет просить заказчик данные своей кредитной карты изатем вызвать программу Java, которая будет отправить запрос в системе Barclays ePDQ принять платеж.Сумма была отправлена ​​как количество пенсов.Не будучи хорошо знакомы с Java, я основаны на коде примера я нашел, что представляет собой общую виде короткого целого числа:

short total;

Программы Java был назван в командной строке.Если он возвращается ничего, то сделка считается успешной, писем было отправлено, и приказ был выполнен. …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.