20. Реакция на ошибки и обработка ошибок в языке Бейсик 20.1. Оператор ERROR для определения используемого кода ошибки и для моделирования ошибки в рамках тестирования программы С помощью оператора ERROR вызываются стандартные сообщения об ошибках из набора сообщений об ошибках Бейсик-интерпретатора, соответственно, моделируются определенные ошибки при тестировании программы. Формат: ERROR (<аргумент>) Аргументом может быть числовое выражение, числовая переменная или числовая константа, принимающая значения больше нуля и меньше 255. При задании значения, соответствующего определенному коду ошибки, оператор ERROR так имитирует возникновение этой ошибки, что, например, возможно проверить корректность работы подпрограммы обработки ошибок. Если должен быть использован собственный код ошибки, то рекомендуется использовать коды начиная с 254 в обратном порядке, чтобы не нарушать совместимости с поздними версиями бейсик-интерпретатора. Список всех сообщений об ошибках, которые могут быть использованы в операторе ERROR, представлен в приложении в. Примечание: Если в программе имеется оператор ON ERROR GOTO (смотри пункт 20.2.), То при компиляции должна быть задана опция /Е. Пример: 10 ERROR 4 RUN OUT OF DATA IN 10 200 ON ERROR GOTO 500 210 INPUT "параметр";к% 220 IF K% < 20 THEN ERROR 254 ... 500 IF ERR=254 THEN PRINT "неверен параметр" 20.2. Оператор ON ERROR GOTO для разветвлений в процедуре реакций на ошибки Формат: ON ERROR GOTO (<номер строки>) При встречающейся ошибке происходит ответвление программы к указанному номеру строки, с которого начинается участок программы, предназначенный для реакции на ошибки и прочие необычные ситуации в Бейсик-программе. Этот участок программы должен завершаться оператором RESUME (см. пункт 20.3.). Разветвление программы выполняется после его первой обработки. При этом возникающие ошибочные ситуации являются причиной соответствующих переходов. В одной программе могут встретиться несколько операторов ON ERROR GOTO. Переход всегда осуществляется к той строке, которая была указана в последнем из подобных операторов. Для отмены действия оператора ON ERROR GOTO должен быть задан оператор с номером строки, равным 0. Если оператор достигается внутри программы обработки ошибок, то выполнение этой части программы прерывается и выдается сообщение об ошибке. Рекомендуется использовать этот оператор во всех тех слечаях, когда ошибки не могут быть устранены с помощью процедуры обработки ошибок. Примечание: Действие оператора ON ERROR GOTO сохраняется и в режиме команд после программного прерывания. В процедуре обработки ошибок не может быть выполнена реакция на возникающую ошибку. Пример: 10 ON ERROR GOTO 10000 . . . 200 INPUT "количество:";ANZ% 210 IF ANZ% > 50 THEN ERROR 243 . . . 10000 IF ERR=243 THEN PRINT "ошибка при вводе количества!" 10010 IF ERL=210 THEN RESUME 200 указание: при использовании бейсик-компилятора необходимо выбирать опцию/е. 20.3. Оператор RESUME для завершения процедуры обработки ошибок Оператор RESUME завершает вызванную по ON ERROR GOTO процедуру обработки ошибок, чтобы возобновить нормальное выполнение программы. Формат: RESUME [0] или RESUME [NEXT] или RESUME [<номер строки>] Форма RESUME или RESUME 0 обеспечивает продолжение с той строки, в которой возникла ошибка. Форма RESUME NEXT обеспечивает продолжение программы со строки, следующей за той, в которой возникла ошибка. Форма RESUME <номер строки> обеспечивает продолжение программы со строки с заданным номером. Примечание: Если требуется компилировать бейсик-программу, то следует использовать опцию/X. 20.4. Переменные ERR и ERL Переменные ERR и ERL являются зарезервированными идентификаторами переменных. При возникновении программной ошибки переменная ERR содержит соответствующий код ошибки. Аналогично при возникновении ошибки переменная ERL содержит номер строки, где она возникла. Если ошибка возникла при прямом вводе, то номер строки равен 65536. Обеим переменным в Бейсик-программе не могут быть присвоены значения. Однако их значения могут быть проверены. При этом проверка переменной ERL должна производится следующим образом: IF ERL = <номер строки> THEN Тем самым гарантируется, что после использования команды RETURN (см. пункт 20.3.) Автоматически будет проставлен правильный новый номер строки. ПРИЛОЖЕНИЕ А. Возможности вызова программ в машинных кодах в языке Бейсик ------------- В языке Бейсик имеется возможность вызова программ в машинных кодах. 1. Функция USR С помощью DEF USR определяется начальный адрес подпрограммы. В регистр а заносится переменная какого типа передается в подпрограмму в машинных кодах: Наполнение регистра А Тип передаваемых переменных --------------------- ---------------------------- A=2 - целое число, занимающее 2 байта а=3 - цепочка символов а=4 - вещественное число обычной точности, занимающее 4 байта а=8 - вещественное число удвоенной точности, занимающее 8 байт Если передаваемый параметр является числом, то пара ррегистров "HL" указывает на аккумулятор (FAC), в котором запоминается число. Аккумулятор имеет длину 8 байт: FAC7, FAC6, ..., FAC0. FAC7 является 1-м байтом, FAC0 - 8-M байтом). Само число находится в аккумуляторе следующим образом: - целое число в байтах FAC3 (младшие биты) и FAC2 (старшие биты) - вещественное число обычной точности в байтах FAC3 (младшие биты мантиссы), FAC2 (средние биты мантиссы) и FAC1 (старшие биты мантиссы, 8-й бит знаковый); в FAC0 находится значение экспоненты, уменьшенное на 128; - вещественное число удвоенной точности находится в байтах с FAC7 до FAC1 (мантисса, в FAC7 младшие биты, в FAC1 старшие биты и знак); в FAC0 находится значение экспоненты, уменьшенное на 128. Если передаваемый параметр является строкой, то пара регистров "СЕ" указывает на трехбайтовое поле описания строки. В 0-м байте этого поля находится длина строки (в диапазоне от 0 до 255). В байтах 1 и 2 размещается адрес начала строки (в 1-м байте младшие биты, во втором байте старшие биты). Внимание! Если строковый параметр является строкой из Бейсика, то поле описания строки находится посередине программы. Ни при каких обстоятельствах оно не должно быть изменено или испорчено! Этого, вообще говоря, можно избежать, если вместо строковой переменной передавать строковое выражение <строковая переменная>+" " В этом случае будет построено новое поле описания строки вне области программы, на которое указывает пара регистров "DE". Функция USR возвращает, как правило, значение того же типа, что и входной параметр. От программиста при возврате параметров требуется правильно задать характеристики типа данных. 2. Оператор CALL Если по CALL вызывается функция или подпрограмма без параметров, то возврат происходит по команде RET. Если по CALL вызывается функция или подпрограмма с параметрами, то для каждого передается 2-хбайтовый адрес. Если параметров не более трех, то адреса находятся в парах регистров "HL" (первый параметр), "DE" (второй параметр) и "BC" (третий параметр). Если параметров более трех, то адреса первых двух параметров находятся в парах регистров "HL" и "DE". Адреса всех остальных параметров размещаются в массиве данных. Начальный адрес этого массива находится в паре регистров "BC". Количество параметров и их типы не контролируются. Ответственность за это возлагается на программиста. Внимание! Передача параметров полностью аналогична передачи в языках Фортран, других Бейсик-диалектах с возможностями компиляции, Паскаль, ПЛ/1, Кобол и т.Д. Тем самым с помощью оператора CALL из бейсика можно непосредственно вызывать загрузочные модули, созданные другими компиляторами. ПРИЛОЖЕНИЕ В. Сообщения об ошибках Бейсик- интерпретатора ------------- При работе Бейсик-интерпретатора могут выдаваться следующие сообщения об ошибках: 1. NEXT WITHOUT FOR В операторе NEXT указана переменная, не употребленная ни в одном из ранее обработанных операторов FOR. 2. SYNTAX ERROR В программной строке найдены ошибочные символы (например, непарные скобки, неверный оператор, ошибочная последовательность точки, запятой и точки с запятой). 3. RETURN WITHOUT GOSUB Обнаружен оператор RETURN, для которого не су- ществует GOSUB. 4. OUT OF DATA Выполнен оператор READ, в то время, как в фай- ле больше нет констант. 5. ILLEGAL FUNCTION CALL Производится передача функции недопустимого параметра. 6. OVERFLOW Результат операции превышает допустимый диапа- зон значений. 7. OUT OF MEMORY Не может быть предоставлено достаточно рабочей памяти озу (причины:слишком большая программа, слишком много переменных, слишком сложные вы- ражения, слишком большая глубина вложенности циклов FOR-NEXT и подпрограмм). 8. UNDEFINED LINE NUMBER В операторах типа GOTO-, GOSUB, IF-THEN, ELSE- или DELETE указан номер строки, не существующей в программе. 9. SUBSCRIPT OUT OF RANGE Используемый индекс элемента массива лежит вне заданных границ. Для многомерного массива воз- можно отсутствие индекса. 10. REDIMENSIONED ARRAY Размерность массива определяется несколько раз это также имеет место, когда элементу массива присваивается значение (при этом автоматически определяется размерность 10), а затем в опера- торе DIM повторно определяется размерность. 11. DIVISION BY ZERO Деление на нуль встретилось в выражени или при возведении в отрицательную степень. В пер- вом случае принимается наибольшее возможное число с правильным знаком, во втором- наиболь- шее возможное положительное число. Прерывание программы не происходит. 12. ILLEGAL DIRECT Недопустимая прямая обработка. 13. TYPE MISMATCH Справа и слева от знака присвоения стоят пере- менные разных типов - строковые и числовые. 14. OUT OF STRING SPACE Строковые переменные занимают всю доступную область памяти, так как их слишком много или они слишком длинные. 15. STRING TOO LONG Была сделана попытка создать цепочку символов из более чем 255 символов. 16. STRING FORMULA TOO Строковое выражение слишком длинное или слиш- CEMPLEX ком сложное. Выражение следует разделить на несколько более меньших выражений. 17. CAN'T CONTINUE Программа не может быть продолжена после пре- рывания, так как она изменена. 18. UNDEFINED USER FUNCTION Функция USR вызывается прежде, чем она опреде- лена. 19. NO RESUME По ON ERROR GOTO был осуществлен переход в подпрограмму обработки ошибок, не содержащую 20. RESUME WITHOUT ERROR Обнаружен оператор RESUME до того, как возник- ла ошибка. 21. UNPRINTABLE ERROR Для возникшей ошибки не существует сообщения об ошибке. Возникает преимущественно тогда, когда задан оператор ERROR с неопределенным кодом ошибки. 22. MISSING OPERAND В операторе не указан соответствующий операнд. 23. LINE PUFFER OVERFLOW Была сделана попытка занести в строку более 255 символов. 26. FOR WITHOUT NEXT Для оператора NEXT отсутствует соответствую- щий оператор FOR. 29. WHILE WITHOUT WEND Для оператора WHILE отсутствует соответствую- щий оператор WEND. 30. WEND WITHOUT WHILE Для оператора WEND отсутствует открывающий оператор WHILE. 50. FIELD OVERFLOW В операторе FIELD определено больше байт, чем задано для длины записи в операторе OPEN-"R". 51. INTERNAL ERROR Внутри бейсик-программы в машинных кодах воз- никла ошибка. Прикладная программа не являет- ся причиной этой ошибки. 52. BAD FILE NAME Требуемый файл с заданным номером не был отк- рыт. 53. FILE NOT FOUND Оператор KILL-, LOAD- или OPEN содержит имя файла, отсутствующего на дискете. 54. BAD FILE MEELE Была сделана попытка выполнить оператор GET или PUT для последовательного файла, загру- зить с помощью LOAD файл прямого доступа или задать оператор OPEN с ошибочным режимом дос тупа. 55. FILE IS ALREADY OPEN Была сделана попытка повторно открыть уже открытый файл. 57. DISK I/O ERROR При чтении или записи на внешнее устройство возникла ошибка, которая не может быть устра- нена операционной системой. 58. FILE ALREADY EXISTS В операторе NAME в качестве нового имени за- дано имя уже существующего на текущем нако- пителе файла. 61. DISK FULL Исчерпана область памяти на внешнем запоми- нающем устройстве. 62. INPUT PAST END Была сделана попытка с помощью оператора INPUT прочесть последовательный файл после конца данных. 63. BAD RECORD NUMBER В операторе PUT или GET используется неразре- шенный номер записи (меньше 1 или более 32767) 64. BAD FILE NAME В операторе KILL-, LOAD-, SAVE- или OPEN- использовано имя файла, не соответствующее до- пустимому формату. 66. DIRECT STATEMENT IN При загрузке программного файла в формате FILE ASCII считана строка без номера строки. Заг- рузка прервана. 67. TOO MANY FILES В оглавлении файлов нет места для записи ново- го файла. Примечание: Не указанные значения номеров сообщений не используются. ПРИЛОЖЕНИЕ С. Сообщения об ошибках Бейсик-компилятора ------------- При трансляции программы компилятором могут возникнуть различные сообщения об ошибках, которые можно разделить на два класса: - ошибки должны быть устранены, так как иначе программа не сможет правильно работать; - предупреждения: имеются неточности, допускаемые компилятором. Решение о необходимости изменений является делом пользователя. Сообщения об ошибках при трансляции выдаются вместе с текстом ошибочной программной строки. Под этой строкой стоит символ "^" в том месте, где компилятором найдена ошибка. Рядом с этим символом выдается код ошибки, состоящий из двух букв. Могут встретиться следующие коды: сообщения об ошибках: BS - недопустимый индекс у переменной массива или неверное количество индексов. CD - в операторе COMMON имя переменной встречается по меньшей мере два раза. CN - в операторе COMMON встретился ранее не определенный массив. CO - операторы COMMON находятся в программе на недопустимом месте. DD - для массива имеется оператор DIM, в то время, как массив уже определен в другом месте прграммы. FD - функция определяется два раза. FN - операторы FOR и NEXT не совпадают или в двух вложенных циклах используется одна и та же переменная цикла. IN - запрошенный по оператору %INCLUDE программный файл не найден на внешнем запоминающем устройстве. LL - делается попытка использовать программную строку из более чем 254 символов. LS - длина цепочки символов больше 255 символов. OM - переполнение рабочей области ОЗУ - слишком большой массив, слишком много переменных, много номеров строк для переходов или слишком большая программа. SN - синтаксическая ошибка. SQ - имеется дублирование номеров строк или операторы стоят в неправильной последовательности. TC - слишком большое выражение; например, оно содержит слишком много переменных, слишком много размерностей или слишком много аргументов. TM - при присвоении или при передаче функции параметров используются несовпадающие или неразрешенные типы данных. UC - в программной строке содержится неопределенный оператор. UF - вызывается функция, которая не определена. WE - или WHILE без WEND, или WEND без WHILE. IO - деление на нуль. IE - отсутствующая опция /Е. IX - отсутствующая опция /Х. Предупреждения: ND - размерность массива не определена явно. SI - встретился оператор, игнорируемый компилятором. Сообщения об ошибках, выдаваемые при обработке скомпилированной программы те же, что и у Бейсик-интерпретатора. Все вместе эти номера ошибок представлены ниже, где указаны только номер ошибки и ее значение. Поясняющий текст следует смотреть в приложении В. Номер ошибки Значение номера ошибки ------------ ----------------------- 2 SYNTAX ERROR Синтаксическая ошибка 3 RETURN WITHOUT GOSUB RETURN без GOSUB 4 OUT OF DATA Конец данных 5 ILLEGAL FUNTION CALL Некорректный вызов функции 6 OVERFLOW Переполнение 9 SUBSCRIPT OUT OF RANGE Значение индекса вне диапазона 11 DIVISION BY ZERO Деление на нуль 14 OUT OF STRING SPACE Превышен размер строки 20 RESUME WITHOUT ERROR RESUME без ошибки 21 UNPRINTABLE ERROR Нераспознаваемая ошибка 50 FIELD OVERFLOW Переполнение поля 51 INTERNAL ERROR Внутренняя ошибка 52 BAD FILE NUMBER Неверный номер файла 53 FILE NOT FOUND Файл не найден 54 BAD FILE MODE Неверный режим работы с файлом 55 FILE ALREADY OPEN Файл уже открыт 56 DISK I/O ERROR Ошибка ввода/вывода на диске 58 FILE ALREADY EXISTS Файл уже существует 61 DISK FULL Диск полон 62 INPUT PAST END INPUT после END 63 BAD RECORD NUMBER Неверный номер записи 64 BAD FILE NAME Неверное имя файла 67 TOO MANY FILES Слишком много файлов ПРИЛОЖЕНИЕ D. Таблица кодов ASCII ------------- Шестнадцатеричное Десятичное Представление Название представление значение символа символа ------------------------------------------------------------------------------- Управляющие символы: 00 0 NUL заполнитель 01 1 ^A SOH начало заголовка 02 2 ^B STX начало текста 03 3 ^C ETX конец текста 04 4 ^D EOT конец передачи 05 5 ^E ENQ запрос 06 6 ^F ACK подтверждение прием 07 7 ^G BEL сигнал 08 8 ^H BS символ назад 09 9 ^I HT табуляция 0A 10 ^J LF новая строка 0B 11 ^K VT вертикальная табул. OC 12 ^L FF продвижение формул. 0D 13 ^M CR возврат каретки 0E 14 ^N SO сдвиг наружу OF 15 ^O SI сдвиг внутрь 10 16 ^P DLE смена канала 11 17 ^Q DC1 уст-во управления 1 12 18 ^R DC2 уст-во управления 2 13 19 ^S DC3 уст-во управления 3 14 20 ^T DC4 уст-во управления 4 15 21 ^U NAK нет подтверждения 16 22 ^V SYN синхросимвол 17 23 ^W ETB конец блока передачи 18 24 ^X CAN отмена