Виды ошибок
Отладка, перехват и обработка ошибок
При написании сценария, содержащего несколько строк, в нем нередко возникают ошибки. В этом разделе рассматривается процесс поиска и исправления ошибок в сценариях.
Отладка представляет собой общий процесс обнаружения и исправления ошибок в сценарии. Перехват ошибок означает выявление ошибок в сценарии, а обработка ошибок — привлечение средств манипулирования ошибками. Например, для отладки сценария в него можно ввести ряд строк кода, в которых проверяется конкретное условие (перехват ошибок), и предписать MAXScript отображать диалоговое окно при появлении ошибки (обработка ошибок).
Отладка и обработка ошибок является неотъемлемой частью процесса написания сценариев. Помимо вновь внедренного отладчика сценариев (MAXScript Debugger), в MAXScript имеется целый ряд других средств и способов отладки кода. К ним относятся цветовое кодирование сценария, проверка уравновешенности скобок, применение внутрипроцессных операторов вывода (на печать или в заданном формате), а также интерпретация сообщений об ошибках и обратное отслеживание по стеку.
В сценарии может возникнуть несколько видов ошибок. Ниже приведены типичные ошибки.
• Syntax — имя переменной или функции введено неверно либо предпринята попытка воспользоваться функцией недозволенным способом.
• Logic — часть сценария выполняет не то, что нужно, поскольку она построена неверно.
• Usererror — эта ошибка возникает при взаимодействии пользователя со сценарием. Так, если в сценарии требуется, чтобы пользователь выделил объект со свойством .radius, в самом сценарии должна быть выполнена проверка соответствия выбранного объекта заданному критерию. Если же объект не соответствует критерию выбора, в сценарии может быть выведено сообщение, предлагающее пользователю выбрать другой объект.
Если возникающая ошибка приводит к сообщению об ошибке, это сообщение обычно выводится в приемнике команд, даже если сценарий выполняется из редактора MAXScript Editor или другого места.
Синтаксическая ошибка происходит при попытке использовать функции, знаки, зарезервированные слова, переменные и прочие элементы языка MAXScript недозволенным способом. Ниже приведено выражение, которое не соответствует правилам языка MAXScript и поэтому приводит к синтаксической ошибке:
for i = 1 to 10 print i
В приемнике команд появляется следующее сообщение об ошибке:
-- Syntax error: at for, expected "do" or "collect"
-- In line: for i
Приложение
Это сообщение означает, что в приведенной выше строке кода пропущено ключевое слово do после числового значения 10.
Ошибка периода выполнения возникает при попытке осуществить в выражении недопустимую операцию во время выполнения сценария, например:
arr = #(1); arr[0]
В приемнике команд появляется следующее сообщение об ошибке:
-- Runtime error: array index must be +ve number, got: 0
Это сообщение означает, что в выражении предпринята попытка доступа к элементу массива по индексу 0, но поскольку индексирование массивов начинается с 1, в данном выражении возникает ошибка.
Логическая ошибка возникает в том случае, если предполагаемый результат не получается, несмотря на соблюдение всех синтаксических правил, например:
y = if x < 0 then 0
В этом выражении нулевое значение безошибочно присваивается переменной y, если x меньше нуля. Но допустим, что на самом деле переменной y нужно было присвоить нулевое значение, если x больше нуля. Причиной данной ошибки является неверная логика программирования. Обнаружить такие ошибки очень трудно, поскольку они не формируют сообщения об ошибках, а их последствия могут проявиться в других местах сценария. В таких случаях рекомендуется писать код с выводом значений переменной в разных частях сценария, чтобы обнаружить место возникновения логической ошибки.
Ошибка периода компиляции возникает ещё до начала выполнения кода, например:
(
y = (1/(х as float) )
-- Compile error: Unexpected end-of-script
В данном выражении отсутствует закрывающая круглая скобка. И хотя формально эта ошибка не является синтаксической, она происходит во время компиляции и поэтому различается как таковая.
Ниже приведен еще один пример ошибки периода компиляции. И эта ошибка не является синтаксической: local x = 0
В приемнике команд появляется следующее сообщение об ошибке:
-- Compile error: no local declarations at top level: x
-- In line: local x =
На первый взгляд, приведенное выше простое выражение выглядит правильно. Где же в нем ошибка? В данном выражении предпринята попытка объявить переменную x как локальную на верхнем уровне сценария, а не в блоке кода. Но локальная переменная может быть объявлена только в блоке кода. Все переменные верхнего уровня считаются глобальными независимо от того, объявлены ли они таковыми.
Пользовательская ошибка возникает в том случае, если пользователь выполняет действие, не соответствующее текущему состоянию сценария. Допустим, что пользователь щелкнул на кнопке, в обработчике событий которой проверяется выбор объектов определенного типа, однако такие объекты не были выбраны. Во избежание
Приложение
ошибки и возможного аварийного сбоя в сценарий следует включить код для проверки данной ситуации (т.е. перехвата ошибки) и совершения соответствующего действия (т.е. обработки ошибки). В дополнение к этому, возможно, потребуется отобразить окно сообщения, в котором пользователю предлагается выбрать сначала какой-нибудь другой объект. Дополнительные сведения по данному вопросу приведены в разделе "Перехват и обработка ошибок" далее в этом приложении.