обработка ошибок on error
Страница 1 из 1
обработка ошибок on error
Программу без ошибок написать практически не возможно. Бывает так, что от программиста мало что зависит. А иногда возникает необходимость эмулировать ошибку. Вот об этом я и расскажу.
FreeBasic не поддерживает новомодные конструкции try catch столь раскрученные нынча, но его обработчик ошибок в принципе, не уступает. Да и многим похож.
"error.bas"
Код завершения программы:
exit code 666
Ввод дополнительной переменной pErr был необходим. Так как пользовательская ошибка будет просто затёрта, а на экране сообщение будет:
Error: 0
Чтобы отключить обработку ошибок, нужно указать нулевую метку.
Код завершения программы, это %errorlevel% в командной оболочке.
Вы в принципе можете с этим не заморачиваться, просто сообщаю для любителей командных файлов.
Кстати, если обработка ошибки не была включена, то программа всё равно будет возвращать коды ошибок, если таковые были.
Есть ещё несколько переменных, которые возвращают информацию об ошибке.
erl строка с ошибкой.
erfn имя функции.
ernm имя модуля.
Для работы с ошибками нужно также компилировать программу с ключами:
-e включить проверку ошибок.
-ex включение поддержки возврата resume.
-exx дополнительная обработка ошибок, неправильные индексы и адреса
Все эти ключи раздувают выходной код вашей программы, поскольку в неё добавляеться дополнительная информация. а также замедляеться её выполнение. так как выполняються дополнительные проверки.
Можно, для удобства, написать модуль для обработки ошибок, а потом подключать его в нужных программах.
error.bas
Сообщение с ошибкой выводит нам функция errhandle(), которую можно будет потом расширить.
Такой модуль обязует начинать код в процедуре main.
Я предпочёл именно такой вариант. Другой вариант заключался в использовании двух модулей.
FreeBasic не поддерживает новомодные конструкции try catch столь раскрученные нынча, но его обработчик ошибок в принципе, не уступает. Да и многим похож.
"error.bas"
- Код:
on error goto l_errhandle ' Включаем обработку ошибок.
' "l_errhandle" это метка, на которую будет сделан переход после ошибки
error 666 ' вызываем пользовательскую ошибку с кодом 666
print "normal" ' этот текст должен будет выведен, если ошибки небыло
sleep
end ' конец программы
l_errhandle:
dim pErr as integer = err ' код ошибки нужно сохранить в отдельную переменную
print "error: " & pErr ' ругаемся, Выводим сообщение об ошибке
sleep
end pErr ' выход из программы с кодом
Код завершения программы:
exit code 666
Ввод дополнительной переменной pErr был необходим. Так как пользовательская ошибка будет просто затёрта, а на экране сообщение будет:
Error: 0
Чтобы отключить обработку ошибок, нужно указать нулевую метку.
- Код:
on error goto 0
Код завершения программы, это %errorlevel% в командной оболочке.
Вы в принципе можете с этим не заморачиваться, просто сообщаю для любителей командных файлов.
Кстати, если обработка ошибки не была включена, то программа всё равно будет возвращать коды ошибок, если таковые были.
Есть ещё несколько переменных, которые возвращают информацию об ошибке.
erl строка с ошибкой.
erfn имя функции.
ernm имя модуля.
Для работы с ошибками нужно также компилировать программу с ключами:
-e включить проверку ошибок.
-ex включение поддержки возврата resume.
-exx дополнительная обработка ошибок, неправильные индексы и адреса
Все эти ключи раздувают выходной код вашей программы, поскольку в неё добавляеться дополнительная информация. а также замедляеться её выполнение. так как выполняються дополнительные проверки.
Можно, для удобства, написать модуль для обработки ошибок, а потом подключать его в нужных программах.
error.bas
- Код:
' обработка ошибок
on error goto l_errhandle
declare sub main()
declare function errhandle(byVal err_code as integer, byval err_line as integer, byval err_function as zstring ptr, byval err_file as zstring ptr) as integer
' вывод сообщения об ошибке
function errhandle(byVal err_code as integer, byval err_line as integer, byval err_function as zstring ptr, byval err_file as zstring ptr) as integer
dim perr as integer = err
beep
print " error! "
print "code: "; err_code
print "file: "; *err_file
print "function: "; *err_function
print "line: "; err_line
print ""
print "press esc to exit"
do
sleep
loop while inkey$ <> chr$(27)
end perr
return 0
end function
main()
print "press any key to exit"
sleep
end 0
l_errhandle:
errhandle(err, erl, erfn, ermn)
Сообщение с ошибкой выводит нам функция errhandle(), которую можно будет потом расширить.
Такой модуль обязует начинать код в процедуре main.
- Код:
#include "error.bas"
sub main()
print "hello, world"
end sub
Я предпочёл именно такой вариант. Другой вариант заключался в использовании двух модулей.
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения