Виды ошибок

Отладка, перехват и обработка ошибок

При написании сценария, содержащего несколько строк, в нем нередко возни­кают ошибки. В этом разделе рассматривается процесс поиска и исправления ошибок в сценариях.

Отладка представляет собой общий процесс обнаружения и исправления ошибок в сценарии. Перехват ошибок означает выявление ошибок в сценарии, а обработка ошибок — привлечение средств манипулирования ошибками. Например, для отладки сценария в него можно ввести ряд строк кода, в которых проверяется конкретное условие (перехват ошибок), и предписать 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 как локальную на верхнем уровне сценария, а не в блоке кода. Но локальная переменная может быть объявлена только в блоке кода. Все переменные верхнего уровня считаются глобальными независимо от того, объявлены ли они таковыми.

Пользовательская ошибка возникает в том случае, если пользователь выполняет действие, не соответствующее текущему состоянию сценария. Допустим, что поль­зователь щелкнул на кнопке, в обработчике событий которой проверяется выбор объектов определенного типа, однако такие объекты не были выбраны. Во избежание
Приложение

ошибки и возможного аварийного сбоя в сценарий следует включить код для проверки данной ситуации (т.е. перехвата ошибки) и совершения соответствующего действия (т.е. обработки ошибки). В дополнение к этому, возможно, потребуется отобразить окно сообщения, в котором пользователю предлагается выбрать сначала какой-нибудь другой объект. Дополнительные сведения по данному вопросу приведены в разделе "Перехват и обработка ошибок" далее в этом приложении.