Не удалось достаточно хорошо выразить заголовок темы, поэтому сначала опишу о чём пойдёт речь. Сейчас, если в исходнике игры есть какие-то ошибки, то движок либо выдаёт их при запуске, либо вообще игнорирует до тех пор, пока не дойдёт до выполнения ошибочного кода. Порой, если где-нибудь в начале кода не закрыть скобочку, то он выводит почти весь исходный текст с указанием, что где-то здесь ошибка. (Поправка: попытался для надёжности воспроизвести эту ситуацию, но как ни старался - не получилось. Неужели прикрыли? ). В большинстве случаев выдаёт неоднозначное "неизвестная ошибка!".
Нельзя ли как-нибудь научить движок давать более подробное место ошибки и её тип? Было бы ещё лучше, если сделать дополнительную функцию проверки исходного кода. Например, запускаешь функцию проверки из tom.dll, а она возвращает список мест, где в исходнике ошибки и их тип. Хотя-бы первую встреченную, если парсер не может обрабатывать код после ошибок. (Было-бы очень неплохо для редактора). Или у кого-то есть идеи получше?
Отлов ошибок интерпретации в движке
Сообщений 1 страница 12 из 12
Поделиться12010-10-24 10:41:16
Поделиться22010-10-25 13:11:10
"неизвестная ошибка!"
- сейчас это чаще всего связано с отказом от AnsiString в обработке исключений. (нестыковка нового интерфейса со старым движком)
В большенстве мест я переделал генерацию ошибок, но еще не везде...
Т.е. новый обработчик ошибок игнорирует сообщения AnsiString, а старый код их исправно генерит.
Если напишешь в каких местах возникают "неизвестные ошибки!" - буду благодарен.
Стандартная обработка ошибки - это строка кода, в которой встречена ошибка, плюс описание самой ошибки.
Да, в случае ошибки со скобками строка кода может оказаться очень большой
Функцию проверки можно сделать только на синтаксис. Полную предварительную проверку сделать невозможно, т.к. язык позволяет очень многое изменить в процессе выполнения.
Поделиться32010-10-25 19:20:14
Функцию проверки можно сделать только на синтаксис.
Было-бы очень хорошо заиметь хотя-бы такую функцию.
Если напишешь в каких местах возникают "неизвестные ошибки!" - буду благодарен.
Ну что-ж, если это действительно будет полезным, то проведу небольшой тест-драйв ТОМа.
В большинстве случаев ТОМ игнорирует ошибки и продолжает выполнять код так, как-будто бы их нет, при этом оставляя некорректные данные. В одних случаях такое поведение - это хорошо, в других - плохо. Например, интернет-браузер должен как-можно правильнее отобразить HTML-страничку вне зависимости от криворукости веб-мастера и количества ошибок, сделанных им. В то же время калькулятор должен как можно точнее вычислять результат, и если введены неверные данные или есть неоднозначность во введённых данных, он должен вывести ошибку или предупреждение и не самовольничать. Я не стану решать, к какому типу относится ТОМ. Лично я склоняюсь ко второму: движок должен говорить обо всех ошибках ещё на стадии тестирования, чтобы игростроитель знал и исправлял их до релиза. Но это ИМХО.
Итак, приступим непосредственно к тестированию ТОМа
Ошибка приведения типов
Код для воспроизведения:
var k = 5 + "это не число"
Результат: k = 5
Попытка обоснования: пытается привести "это не число" в число, не может этого сделать и возвращает 0. А 5 + 0 = 5.
Преступные действия: Игнорирование ошибки
Очень большое число
Код для воспроизведения:
var i = 234245224 * 23342342
Результат: i = -539749776
Попытка обоснования: Не проверяя на величину чисел сразу перемножает. При переполнении старшие биты срезаются и получается корявое число.
Преступные действия: Игнорирование ошибки
исправлено в версии 0.9.4.5
Неверный оператор
Код для воспроизведения:
var i = 222 *** 2333
Результат: Вывод ошибки "неизвестная ошибка!"
Попытка обоснования: Не может понять оператор *** и ругается.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5
switch без параметров
Код для воспроизведения:
switch()
case("2") %2
case("3") %3
Результат: Вывод ошибки "неизвестная ошибка!"
Попытка обоснования: Увидел, что нету параметров в switch и ругается.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5
2 одинаковых параметра в switch
Код для воспроизведения:
switch("2")
case("2") %первое повторение
case("2") %второе повторение
Результат: Игнорирование. Вывод только "первое повторение".
Попытка обоснования: Оператору switch безразличо присутствие перекрывающихся case. Выполняет первое подходящее.
Преступные действия: Нет
Незакрытая фигурная скобка в строке
Код для воспроизведения:
% это строка {hello
Результат: Вывод ошибки "в строке, переданной парсеру, скобки {} недопустимы!".
Попытка обоснования: Не найдя закрывающую скобку передаёт всю строку парсеру. Тому это не нравится и он ругается.
Преступные действия: Выводимое описание ошибки не раскрывает её суть
исправлено в версии 0.9.4.5
Начиная с версии 0.9.4.5 отключена система событий, извлекаемых из выводимого текста. Идея была интересная, но на текущем уровне развития не работающая (( ASBer
Пробелы в названии объекта
Код для воспроизведения:
уникальное лесной зверёк
{ %{name}
}
Результат: Вывод ошибки "неизвестная ошибка!".
Попытка обоснования: Нет предположений.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5
Неправильное имя объекта
Код для воспроизведения:
уникальное 22-й { }
Результат: Вывод ошибки "недопустимое имя объекта!".
Попытка обоснования: Видит цифры в начале имени и ругается.
Преступные действия: Всё ОК
Дефис в имени объекта
Код для воспроизведения:
уникальное лесная-птишка
{ title = "потерявшаяся птичка"
%уникальное, Появись!
%{name}
}
%Вот тайтл: {лесная-птичка.title}. Нету? Вот так-то!
Результат: Игнорирование объекта. При выполнении указанного кода выводится только "Вот тайтл: . Нету? Вот так-то!"
Попытка обоснования: Понимает, что лесная-птишка - это одно слово и в нём ошибка, но не может понять, что надо выводить ошибку.
Преступные действия: Игнорирование создаваемого объекта с ошибкой
исправлено в версии 0.9.4.5
Вывод несуществующего объекта
Код для воспроизведения:
%Вывод несуществующего значения: {GiGi}
Результат: "Вывод несуществующего значения: "
Попытка обоснования: Не найдя объект GiGi заменяет его на null и выводит как пустую строку.
Преступные действия: Как-то не интуитивно понятно
Рандом не с числом
Код для воспроизведения:
rnd("это не число")
Результат: Вылет ТОМа. Ошибка "Исключение unknown software exception (0xc0000094) в приложении по адресу 0x015d6135.".
Попытка обоснования: Без проверки передаёт строку каким-то небезопасным указателем в генератор случайных чисел. Тот, увидев не число сразу дохнет унося в могилу ТОМ.
Преступные действия: Вылет тома без обоснования причин
исправлено в версии 0.9.4.5
Складывание объекта с числом
Код для воспроизведения:
уникальное корзинка {}
корзинка + 2
Результат: Вывод ошибки "корзинка - изменилось число уникального объекта!"
Попытка обоснования: Пытаясь прибавить к корзинке ещё 2 штуки понимает, что корзинка не счётное и ругается.
Преступные действия: Всё ОК
Присвоение объекту числа
Код для воспроизведения:
уникальное корзинка {}
корзинка = 2
Результат: Вывод ошибки "неизвестная ошибка!"
Попытка обоснования: Пытаясь присвоить объекту число понимает, что нельзя и ругается.
Преступные действия: Не достаточно информации об ошибке
исправлено в версии 0.9.4.5
Выход за пределы содержимого объекта
Код для воспроизведения:
уникальное корзинка {}
%второй предмет в корзинке: {корзинка.item[2]}
Результат: Игнорирование выхода за пределы "массива".
Попытка обоснования: Видит, что в корзинке нет 2-го предмета и возвращает пустой предмет.
Преступные действия: Всё ОК
Присвоение pers числа
Код для воспроизведения:
pers=2
Результат: Вывод ошибки "должен быть объект!"
Попытка обоснования: В качестве pers можно задать только объект. ТОМ это понимает и ругается, если кто-то пытается нарушить это правило.
Преступные действия: Всё ОК
Неверные символы
Код для воспроизведения:
разве?
{ }
Результат: Вывод ошибки ""'?' - ошибка синтаксиса!""
Попытка обоснования: Видит недопустимый символ "?" и полностью растерявшись в догадках всё же находит единственно правильное решение: высказать всё красным текстом.
Преступные действия: Всё ОК
Неверные операции с логикой
Код для воспроизведения:
%{null + false}
Результат: Вывод ошибки "bool x bool!"
Попытка обоснования: Видит, что нельзя так складывать и ругается каким-то экзотическим способом в надежде, что пользователь его поймёт.
Преступные действия: Всё ОК. Только сообщение об ошибке не очень внятное.
Задание числа в качестве класса
Код для воспроизведения:
unique Красная_Шапочка { }
Красная_Шапочка.cls = 2
Результат: Вывод ошибки "object.cls=number!"
Попытка обоснования: ТОМ пытается сказать, что класс не может быть числом.
Преступные действия: Всё ОК.
Ещё, если после какой-либо "красной" ошибки (например, "неизвестная ошибка!") ввести любую строку, то он продолжит выполнение некорректного кода. Т.е. если после ошибки исправить её в блокноте и набрать "заново", то программа отработает дважды: первый раз некорректная, оставшаяся в памяти, а потом вторая исправленная. Это может ввести в заблуждение незнающего юзера: "почему программа выполняется дважды?". исправлено в версии 0.9.4.5
Если забыть закрыть кавычки и после них по пути не будет встречена ни одна двойная кавычка, то ТОМ выведет весь текст после незакрытой кавычки. Это, порой бывает очень большой текст и проще получается принудительно закрыть том, чем дождаться вывода этого текста. Это тоже неудобно.
Все тесты проводились на ТОМ v.0.9.4.4 dev.
Ну вот и всё, что удалось накопать за пару часиков. Надеюсь, этот небольшой "баг-репорт" поможет в улучшении ТОМа.
Поделиться42010-10-26 09:06:45
Супер! Отличная работа! Можно выпускать следующую версию чисто как багфикс
В большинстве случаев ТОМ игнорирует ошибки и продолжает выполнять код так, как-будто бы их нет, при этом оставляя некорректные данные. В одних случаях такое поведение - это хорошо, в других - плохо. Например, интернет-браузер должен как-можно правильнее отобразить HTML-страничку вне зависимости от криворукости веб-мастера и количества ошибок, сделанных им. В то же время калькулятор должен как можно точнее вычислять результат, и если введены неверные данные или есть неоднозначность во введённых данных, он должен вывести ошибку или предупреждение и не самовольничать. Я не стану решать, к какому типу относится ТОМ. Лично я склоняюсь ко второму: движок должен говорить обо всех ошибках ещё на стадии тестирования, чтобы игростроитель знал и исправлял их до релиза. Но это ИМХО.
ТОМ в плане контроля ошибок пока не проработан как это нужно.
Вообще идеальный вариант, когда на стороне игрописателя ТОМ отслеживает ошибки в режиме "параноик", а на стороне игрока прощает все некритические или предполагаемые ошибки.
Еще есть такой момент: я позиционирую язык ТОМа как высокоуровневый.
Т.е. даже простейшие операции (приведение типов, например) выполняются с некоторой "интеллектуальной" обработкой.
Там, где любой низкоуровневый язык выдаст ошибку, ТОМ пытается вернуть некоторый результат. Это просто такая идеология языка.
Поделиться52010-10-26 10:10:03
Ошибка приведения типов
Код для воспроизведения:Код:var k = 5 + "это не число"Результат: k = 5
Попытка обоснования: пытается привести "это не число" в число, не может этого сделать и возвращает 0.
А 5 + 0 = 5.
Преступные действия: Игнорирование ошибки
Не считаю это ошибкой. Это просто такое правило приведения строки к числу.
В режиме параноик нужно выводить предупреждение.
Хотя немного подумав, строку не содержащую число, нужно приводить не к 0 а к 1:
var X = 0 X = X + "5 груш" X = X + "10 груш" X = X + "груша в кармане" X = X + "груша в зубах" %всего {X} груш.
Это пример подсчета груш, построенный на приведении строк к числу. Сейчас даёт неверный результат.
Поделиться62010-10-26 10:21:14
Вывод несуществующего объекта
Код для воспроизведения:Код:%Вывод несуществующего значения: {GiGi}Результат: "Вывод несуществующего значения: "
Попытка обоснования: Не найдя объект GiGi заменяет его на null и выводит как пустую строку.
Преступные действия: Как-то не интуитивно понятно
Отсутствие объекта, переменной, свойста объекта или его метода - это не ошибка! Абсолютно нормальная ситуация.
Можно всегда проверить: if(GiGi == null) {...}
Поделиться72010-10-26 10:26:18
Не считаю это ошибкой. Это просто такое правило приведения строки к числу.
Отсутствие объекта, переменной, свойста объекта или его метода - это не ошибка!
Ну я и не настаиваю. Большинство приведённых мной "ошибок" действительно не являются ошибками для ТОМа и были добавлены для массовки. Вдруг натолкнёт на какую-нибудь идею.
на стороне игрописателя ТОМ отслеживает ошибки в режиме "параноик"
Неплохой режим был-бы. Полезный. Вот только реализовать его будет не просто. Ведь столько моментов надо учитывать...
var X = 0
X = X + "5 груш"
X = X + "10 груш"
X = X + "груша в кармане"
Любопытно. Вот только не станет ли он к грушам в одну кучу скидывать и яблоки?
var X = 0 X = X + "5 груш" X = X + "10 яблок" X = X + "яблоко на дереве"
Поделиться82010-10-26 10:32:23
Т.е. если после ошибки исправить её в блокноте и набрать "заново", то программа отработает дважды: первый раз некорректная, оставшаяся в памяти, а потом вторая исправленная.
Как такого добиться мне непонятно. Вывод ошибки полностью и безвозвратно прерывает выполнение кода.
Повторить не удалось... если есть примерчик, покажи плиз.
Поделиться92010-10-26 10:35:42
Вот только не станет ли он к грушам в одну кучу скидывать и яблоки?
Да, конечно посчитает общее количество фруктов
Это уже автор должен думать что тут он хочет считать таким образом
Поделиться102010-10-26 10:46:21
Повторить не удалось... если есть примерчик, покажи плиз.
1. Создаём в блокнотике простенькую программу с ошибкой:
%Проверка повторного выполнения программы %{33/0}
2. Сохраняем файл.
3. Запускаем его в ТОМе. Видим ошибку:
> запустить
33/0
деление на ноль!
4. Не закрывая ТОМ переключаемся в блокнотик, комментируем ошибочную строку:
%Проверка повторного выполнения программы //%{33/0}
5. Сохраняем исправленную программу.
6. Переключаемся в ТОМ. Набираем "заново":
> заново
Проверка повторного выполнения программы
Проверка повторного выполнения программы
Программа отработала 2 раза.
исправлено в версии 0.9.4.5
Поделиться112010-10-26 11:37:42
Программа отработала 2 раза.
Ok, спасибо!
Это текст от первого выполнения не чистится и выводится при первом возможном случае, исправлю.
Поделиться122010-11-01 18:51:32
Вот еще одна ошибка, приводящая к вылету
x = 12345678901234567890 %{x}
исправлено в версии 0.9.4.5