Ошибки времени выполнения
Во время работы приложения могут возникать ошибки, которые называются ошибками времени выполнения (run time errors) или исключениями (exceptions). В большинстве случаев причинами исключений являются неверные исходные данные. Например, если во время работы программы вычисления силы тока в поле Напряжение ввести ю.5, т. е. разделить целую и дробную часть точкой, то в результате щелчка на кнопке Вычислить на экране появится окно с сообщением об ошибке (рис. 38).
Рис. 38. Пример окна с сообщением об ошибке времени выполнения (программа запущена из Windows)
Причина возникновения ошибки в следующем. В тексте программы дробная часть числа от целой отделяется точкой. При вводе данных в поле редактирования пользователь может отделить дробную часть числа от целой точкой или запятой. Какой из этих двух символов является правильным, зависит от настройки Windows. Если в настройке Windows указано, что разделитель целой и дробной частей числа — запятая (для России это стандартная установка), а пользователь использовал точку (ввел в поле Напряжение (Edit1) строку 10.5), то при выполнении инструкции
u = StrToFloat(Editl->Text);
возникнет исключение, т. к. при указанной настройке Windows содержимое поля редактирования и, следовательно, аргумент функции StrToFloat не является изображением дробного числа. Если программа запущена из среды разработки, то при возникновении исключения выполнение программы приостанавливается и на экране появляется окно с сообщением об ошибке и ее типе.
Рис. 39. Пример сообщения о возникновении исключения (программа запущена из C++ Builder)
В качестве примера на рис. 39 приведено окно сообщения о возникновении исключения, причина которого заключается в том, что строка, введенная пользователем в поле редактирования, не является дробным числом.
После возникновения исключения и щелчка на кнопке ОК в диалоговом окне Debugger Exception Notification (рис. 39) выполнение программы можно прервать или, несмотря на возникшую ошибку, продолжить. Чтобы прервать выполнение программы, надо в меню Run выбрать команду Program Reset, чтобы продолжить — команду Step Over.
Обработку исключений берет на себя автоматически добавляемый в выполняемую программу код, который обеспечивает, в том числе, и вывод информационного сообщения. Вместе с тем C++ Builder дает возможность программе самой выполнить обработку исключения.Инструкция обработки исключения выглядит так:
Try
{
// здесь инструкции, выполнение которых может вызвать исключение
}
catch ( Тип &е)
{
// здесь инструкции обработки исключения
}
где:
· try — ключевое слово, обозначающее, что далее следуют инструкции, при выполнении которых возможно возникновение исключений, и что обработку этих исключений берет на себя программа;
· catch — ключевое слово, обозначающее начало секции обработки исключения. Инструкции этой секции будут выполнены, если в программе возникнет исключение указанного типа.
Основной характеристикой исключения является его тип. В табл. 12 перечислены наиболее часто возникающие исключения и указаны причины, которые могут привести к их возникновению.
Таблица 12.Типичные исключения
Исключение | Возникает |
EConvertError — ошибка преобразования | При выполнении преобразования, если преобразуемая величина не может быть приведена к требуемому типу. Наиболее часто возникает при преобразовании строки символов в число |
EDivByZero — целочисленное деление на ноль | При выполнении операции целочисленного деления, если делитель равен нулю |
EZeroDivide — деление на ноль | При выполнении операции деления над дробными операндами, если делитель равен нулю |
EInOutError — ошибка ввода/вывода | При выполнении файловых операций. Наиболее частой причиной является отсутствие требуемого файла или, в случае использования сменного диска, отсутствие диска в накопителе |
В программе вычисления силы тока исключения могут возникнуть при выполнении преобразования строк, введенных в поля редактирования, в числа и при вычислении величины тока. Исключение EConvertError возникнет, если пользователь неправильно введет числа в поля редактирования: например, разделит целую и дробную части точкой. Исключение EZeroDivide возникнет, если пользователь задаст величину сопротивления равной нулю. В листинге 2.3 приведена функция обработки события Onclick на командной кнопке Вычислить. В функцию включены инструкции обработки исключений.
Листинг 3. Обработка исключений
void __fastcall TForml::ButtonlClick(TObject *Sender)
{
float u; // напряжение
float r; // сопротивление
float i; // ток
// получить данные из полей ввода
// возможно исключение — ошибка преобразования строки в число
Try
{
u=StrToFloat(Edit1->Text);
r=StrToFloat(Edit2->Text);
}
catch (EConvertError &e)
{
ShowMessage("При вводе дробных чисел используйте запятую.");
Дата добавления: 2015-07-30; просмотров: 772;