Страницы

пятница, 11 сентября 2009 г.

Обработка ошибок

Об этой вещи я уже писал, но хотел бы ещё раз вернуться к этой теме, тем более что она важна. Итак, тема — Обработка ошибок.


Абсолютно все новички этим инструментом не пользуются до тех пор пока программа работает отлично, и до тех пор пока они не потратят достаточно времени на отладку программы. Как мы знаем, насколько не был бы гениален программист ему не избежать ни синтаксических, ни логических ошибок. Но! Опытный программист может ограничить их влияние на программу, и не только ускорить процесс отлова ошибки, но и избежать фатальных сбоев. Рассмотрим одну из самых частых и опасных ошибок — «деление на ноль».

draw_text(32, 32, string(2 / (mouse_x - 256));
При mouse_x = 256 произойдёт чудо! Ошибка деления на ноль. В данном случае, мы отдаём на откуп программе ошибку, т.е. отдаём ей права на обработку ошибки. Она справится по своему, со всей ответственностью: закончит сообщением о фатальной ошибке (ну в Game maker можно проигнорировать). Что же может сделать программист для того чтобы программа работала даже при mouse_x = 256? А вот что, обработать ошибку вручную:
if(mouse_x == 256)
draw_text(32, 32, 'Недопустимое значение.');
else
draw_text(32, 32, string(2 / (mouse_x - 256));
Видите как всё просто! Теперь программа будет работать стабильно при любых значениях, а при неправильных значениях нас предупредят что такое значение недопустимо. То есть, что мы делаем? Мы то значение которое может повести себя странно, вылезти за границы и т.д. обрамляем условием и обрабатываем в отдельности. Естественно, не при каждом условий программа будет вести себя гладко, например, если потеряны важные данные, то всё равно придётся аварийно остановить программу:
var file;

if(file_exists('\data\hero.txt'))
file = file_text_open('\data\hero.txt');
else
{
if(debug)
show_message('Файл hero.txt не существует.');


game_end();
}
В данном случае, всё зависит от существенности отсутствующего файла. Если он не важен, то game_end() можно убрать, а просто предупредить в отладочном режиме, что файла такого-то не существует. Если же важен, например, там хранятся все данные о объекте-герое, то тут надо предупредить что такого-то файла не существует и завершить аварийно программу с причиной и с номером ошибки. Важность того или иного объекта решает программист и человек отвечающий за разработку объекта. Если отсутствует картинка курсора, то можно заменить её на стандартную и продолжить работу, а не выкидывать, или например, отсутствуют звуки, это неприятно, но не фатально. А если же отсутствует вся графика, то тут уж можно смело выходить.

Главное найти ту грань которая определяет, что важно в программе (без чего она не сможет функционировать правильно), а чем можно пожертвовать. Особенно это важно в функциях. Что можно пихать в функцию, а что нет. Важно сунуть функций не только нужный тип данных, но и нужную информацию. У меня был такой случай что программа выходила с фатальной ошибкой. В чём проблема, я не мог понять, ведь данные правильные (как мне казалось) подаются. Функций нужны были строки, вот и я подавал строки (и приходили строки). Но! Приходили строки такие, при обработке которых возникала фатальная ошибка. Её я искал несколько часов.

Проверяйте не только сопоставление типов данных, но и на валидность, правильность. Проверяйте всё. Работает с объектами? Проверяйте существует ли объект с которым вы работаете. Работает с текстом? Проверяйте его на валидность, и вообще, существует ли он. Работаете с данными? То проверяйте существуют ли они, правильны ли они и т.д. Лишняя проверка замедлит код, но упростит дальнейшую его отладку.

Попробуйте правильно обработать ситуацию:

draw_text(32, 32, string(1 - sqrt(128 - mouse_x)));
var file;
file = file_text_open('\data.bin');
grid = ds_grid_create(ceil(random(100)), ceil(random(100)));
draw_text(32, 32, string(ds_grid_get(grid, (mouse_x - 64) div 4, (mouse_y - 64) div 4)));
Придумайте сами, или загляните в свой код.

Комментариев нет:

Отправить комментарий