Не могу понять, как писать исключения
Модератор: Модераторы
Не могу понять, как писать исключения
Можете смеяться надо мной, но я никак не могу понять, как писать исключения на Object Pascal. Вот такой простой пример, нужно написать исключение при попытке деления на ноль, чтобы выходило сообщение, что делить на ноль нельзя и при компиляции не выскакивала ошибка. Я перерыл уже весь интернет и ни один из вариантов не работает. Пробовал делать это в Lazarus, Geanu, компилил из консоли и ничего не работает.
var
result, a, b : real;
begin
try
a := 10;
b := 0;
result := a / b;
except
writeln('нельзя делить на ноль');
end;
readln;
end.
Вот что в этом коде нужно дописать, поменять чтобы работало? Указать после except саму ошибку? Но как она правильно называется, как правильно её указать? И где найти список всех исключений? Их нигде нет, или не там ищу?
var
result, a, b : real;
begin
try
a := 10;
b := 0;
result := a / b;
except
writeln('нельзя делить на ноль');
end;
readln;
end.
Вот что в этом коде нужно дописать, поменять чтобы работало? Указать после except саму ошибку? Но как она правильно называется, как правильно её указать? И где найти список всех исключений? Их нигде нет, или не там ищу?
Код: Выделить всё
try
.....
result := a/b;
except
on EZerroDivision do writeln('нельзя делить на ноль');
on Exception do writeln('Другая фигня');
end;
Нужно сделать uses SysUtils;, он занимается преобразованием ситуации, возникающей при делении на 0, в бросание исключения языка EZeroDivision.
Всё же EZeroDivide, я полагаю.
И, наверно, лучше сказать, что если модуль SysUtils не подключён(прямо или косвенно), блок try except исключения ловить не будет{$зануда off}.
И, наверно, лучше сказать, что если модуль SysUtils не подключён(прямо или косвенно), блок try except исключения ловить не будет{$зануда off}.
Странно, но тоже не работает. В Lazarus ругается на do перед writeln, если компилировать в консоли, то вообще не понимает, что такое try и выводит ещё кучу ошибок. Причём делал на разных машинахDedFrend писал(а):А список исключений надо искать среди потомков класса Exception, имя которых принято начинать с буквы EКод: Выделить всё
try ..... result := a/b; except on EZerroDivision do writeln('нельзя делить на ноль'); on Exception do writeln('Другая фигня'); end;
Спасибо всем, кто ответил. Кажется я разобрался. Во первых нашёл список с исключениями. В моём случае нужно указать EZeroDivide. Так же, в Lazarus при создании консольного приложения программа сама вписывает в начало файла подключение необходимых пакетов, команд без которых ничего работать не будет. Я поэксперементировал, поудалял некоторые из списка и для моей задачи актуальным оказался {$MODE OBJFPC}, как мне подсказал пользователь Alexander.
Только Lazarus всё равно будет сообщать о возникшем исключении вызвав остановку выполнения программы даже при удачной компиляции, и окно консоли будет пустым. Чтобы извещение в нём появилось нужно нажать снова запуск и извещение 'Делить на ноль нельзя!' в консоли появится, после чего можно закрывать окно консоли. Непонятно где в настройках Lazarus отключить это чтобы не останавливал исполнение программы. А так всё работает. Может кому из новичков пригодится, то прилагаю скан, как всё должно выглядеть.
Только Lazarus всё равно будет сообщать о возникшем исключении вызвав остановку выполнения программы даже при удачной компиляции, и окно консоли будет пустым. Чтобы извещение в нём появилось нужно нажать снова запуск и извещение 'Делить на ноль нельзя!' в консоли появится, после чего можно закрывать окно консоли. Непонятно где в настройках Lazarus отключить это чтобы не останавливал исполнение программы. А так всё работает. Может кому из новичков пригодится, то прилагаю скан, как всё должно выглядеть.
- Вложения
-
- 2.png (9.93 КБ) 32389 просмотров
Это всё проделки отладчика, кнопка "Запуск"(F9) запускает приложение в отладчике. Можно просто запустить скомпилированное приложение из Проводника или воспользоваться командой "Запустить без отладки"(Shift+Ctrl+F9).Leon70 писал(а):Только Lazarus всё равно будет сообщать о возникшем исключении вызвав остановку выполнения программы даже при удачной компиляции, и окно консоли будет пустым. Чтобы извещение в нём появилось нужно нажать снова запуск и извещение 'Делить на ноль нельзя!' в консоли появится, после чего можно закрывать окно консоли. Непонятно где в настройках Lazarus отключить это чтобы не останавливал исполнение программы.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
В меню "Сервис-Настройка", в категории "Отладчик" есть списки "Исключения языка" и "Исключения ОС", куда можно добавить нужные классы исключений, которые требуется обрабатывать нестандартным образом. В данном случае EZeroDivide относится к исключениям ОС.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
ЕЯПП, то result - это функция, а не переменная...Даже подчерк ругается... может result в resulttt переименовать...
result - это зарезервированное слово языка. Его нельзя использовать в качестве имени чего-то.то result - это функция, а не переменная..
По теме. Обычно пишу так:
Код: Выделить всё
...
try
...
except
on E: Exception do
begin
...
writeln (E.Message);
end;
end;
Ну и насчет того, как принудительно вызвать исключение:
Код: Выделить всё
if b=0 then raise Exception.Create('Message text');Little_Roo писал(а):ЕЯПП, то result - это функция, а не переменная...
Есть ложь, но иногда есть ещё и сообщения от Little_Roo и slyubez?slyubez писал(а):result - это зарезервированное слово языка. Его нельзя использовать в качестве имени чего-то.
А иногда делить на 0 нужно и делается это не через исключение а через функцию, проверяющую делитель и заменяющую 0 на нужное число.
