обработка ошибок on error

Предыдущая тема Следующая тема Перейти вниз

обработка ошибок on error

Сообщение  Eric-S в Чт Авг 21, 2008 7:14 am

Программу без ошибок написать практически не возможно. Бывает так, что от программиста мало что зависит. А иногда возникает необходимость эмулировать ошибку. Вот об этом я и расскажу.


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




Я предпочёл именно такой вариант. Другой вариант заключался в использовании двух модулей.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения