Работа над ошибками

Эта статья завершает учебник по встроенным средствам FreeBasic.
Как бы вы не старались, какими бы вы профессионалами не были, вы будете совершать ошибки при программировании и не только... Самое важное сделать кол-во ошибок минимальным, а так же по возможности предупредить ошибки в своем коде при использовании вашей программы другими людьми. Ведь это у вас при использовании какого-то кода, все настроено и лежит в указанных папках, со своим арсеналом библиотек. У пользователя может оказаться система на которой нет определенных файлов, или вообще другие настройки системы, которые будут конфликтовать с вашей программой. Именно поэтому программисты в свое время придумали обработчики ошибок. Часто программисты любят делать свои собственные обработчики ошибок, но у языка FreeBasic есть для этого встроенные средства, которые мы и рассмотрим.

 

On Error

При установке данного макроса с оператором GOTO и вашей меткой для перехода в начале программы , запускается стандартный обработчик ошибок. Все серьезные ошибки будут им обработаны. Единственно надо не забыть при компиляции указать флаг -e  пример: fbc -e "1.bas".

Синтаксис:

On Error Goto Label  - глобальный для кода

On Local Error Goto Label - локальный для процедур и функций

Таблица кодов ошибок:

Код ошибки Обозначение
0 без ошибок
1 незаконное обращение к функции
2 файл не найден
3 файловая ошибка ввода\вывода
4 выход за рамки памяти
5 не возможно возобновление
6 выход за рамки массива
7 нулевой указатель
8 нет привилегий
9 прерванная операция
10 неверная инструкция
11 ошибка связанная с дробным числом
12 нарушение сегмента памяти
13 обрыв запроса
14 аварийное завершение
15 выход запроса

Пример:

On Error Goto ErrorLabel
Dim As Integer Ptr Beta(10)
*beta(123)=66
Print "All Ok"
End
ErrorLabel:
Print Err
Sleep

Как видите, строка выводящая сообщение "All Ok" не выполняется , поскольку обработчик событий обнаружил ошибку и перевел управление на метку ErrorLabel. Данный обработчик неплохо использовать с функциям, работающими с созданиями и загрузками из файлов. Разработчики FreeBasic убрали из арсенала новых версий команды старого бейсиковского стиля (gosub,resume, resume next). А ведь команды resume позволяли после обработки ошибок возвращаться на место вызова ошибки и возобновлять выполнение программы. В итоге обработчик событий потерял гибкость управления им. Наверное у разработчиков были серьезные мотивы, раз они решились на такое.

 

Err()

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

 

Error

Эта функция позволяет сэмулировать код ошибки.

Пример:

On Error Goto AA
Error 10
? "All OK"
AA:
? Err
Sleep

 

Erl()

Функция Erl возвращает номер строки на которой произошла ошибка.

Пример:

On Error Goto AA
Screen 1
Bload ("123.jpg")
Sleep
End
AA:
Var er=Err
? "Error ";er,"  on line ";Erl
Sleep


Обратите внимание, после произошедшей ошибки в этом примере я сначала присвоил ее переменной, а потом выводил надпись. Если занести ее в строку вывода,  то функция Err вернет код ошибки функции Erl . Поскольку функция Erl выполняется без ошибки будет возвращено 0. В нашем же примере все правильно: будет возвращено 2.

 

Erfn и Ermn

Эти две функции возвращают имя функции(Erfn)  и  имя модуля(Ermn) в котором произошла ошибка. Компилировать следует с флагом -exx

Пример:

Sub Generate_Error()
  On Error Goto Handler
  Error 1000
  Exit Sub
Handler:
  Print "Error Function: "; *Erfn()
  Print "Error Module  : "; *Ermn()
  Sleep
End Sub
Generate_Error()

 

Вот собственно и все. Программируйте, ошибайтесь, с гордостью находите свои ошибки и снова программируйте :))  Всего доброго!

смайлик

Конец учебника

содержание | назад