Работа над ошибками
Эта статья завершает учебник по встроенным средствам 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()
Вот собственно и все. Программируйте, ошибайтесь, с гордостью находите свои ошибки и снова программируйте :)) Всего доброго!
Конец учебника