Обработка ошибок
Если в предыдущей программе пользователь введёт не числа, а что-то другое (или пустую строку), программа выдаст сообщение о необработанной ошибке на английском языке и предложит завершить работу. Хорошая программа никогда не должна завершаться аварийно, для этого все ошибки, которые можно предусмотреть, надо обрабатывать.
В современных языках программирования есть так называемый механизм исключений, который позволяет обрабатывать практически все возможные ошибки. Для этого все «опасные» участки кода (на которых может возникнуть ошибка) нужно поместить в блок try — except:
try {"опасные" команды} except {обработка ошибки} end;
Слово try по-английски означает «попытаться», except — «исключение» (исключительная или ошибочная, непредвиденная ситуация). Программа попадает в блок except — end только тогда, когда между try и except произошла ошибка.
В нашей программе «опасные» команды — это операторы преобразования данных из текста в числа (вызовы функции StrToInt). В случае ошибки мы выведем вместо кода цвета знак вопроса. Улучшенный обработчик с защитой от неправильного ввода принимает вид:
try r:=StrToInt(rEdit.Text); g:=StrToInt(gEdit.Text); b:=StrToInt(bEdit.Text); rgbShape.Brush.Color:=RGBToColor(r,g,b) ; rgbLabel.Caption:='#1+IntToHex(r,2)+IntToHex(g,2) + IntToHex(b,2); except rgbLabel.Caption:='?'; end;
Чтобы увидеть результат такой обработки ошибок, нужно запускать программу отдельно, не из среды Lazarus, иначе система перехватывает ошибки в отладочном режиме.
Существует и другой способ защиты — блокировать при вводе символы, которых быть не должно (буквы, скобки и т. п.). В нашей программе для всех полей ввода можно установить такой обработчик события OnKeyPress (в переводе с англ. — при нажатии клавиши 1):
1 Если в программе нужно обрабатывать русские буквы, используется обработчик OnUTF8Key.
procedure TForml.rEditKeyPress(Sender: TObject; var Key: char); begin if not (Key in [ '0'..'9',#8]) then Key:=#0; end;
Следующая страница Вопросы и задания