Страница 1 из 1
Не могу понять, как писать исключения
Добавлено:
03.11.2023 08:33:20
Leon70
Можете смеяться надо мной, но я никак не могу понять, как писать исключения на Object Pascal. Вот такой простой пример, нужно написать исключение при попытке деления на ноль, чтобы выходило сообщение, что делить на ноль нельзя и при компиляции не выскакивала ошибка. Я перерыл уже весь интернет и ни один из вариантов не работает. Пробовал делать это в Lazarus, Geanu, компилил из консоли и ничего не работает.
var
result, a, b : real;
begin
try
a := 10;
b := 0;
result := a / b;
except
writeln('нельзя делить на ноль');
end;
readln;
end.
Вот что в этом коде нужно дописать, поменять чтобы работало? Указать после except саму ошибку? Но как она правильно называется, как правильно её указать? И где найти список всех исключений? Их нигде нет, или не там ищу?
Re: Не могу понять, как писать исключения
Добавлено:
03.11.2023 20:35:02
DedFrend
- Код: Выделить всё
try
.....
result := a/b;
except
on EZerroDivision do writeln('нельзя делить на ноль');
on Exception do writeln('Другая фигня');
end;
А список исключений надо искать среди потомков класса Exception, имя которых принято начинать с буквы E
Re: Не могу понять, как писать исключения
Добавлено:
04.11.2023 01:27:53
runewalsh
Нужно сделать uses SysUtils;, он занимается преобразованием ситуации, возникающей при делении на 0, в бросание исключения языка EZeroDivision.
Re: Не могу понять, как писать исключения
Добавлено:
04.11.2023 08:51:24
iskander
Всё же EZeroDivide, я полагаю.
И, наверно, лучше сказать, что если модуль SysUtils не подключён(прямо или косвенно), блок try except исключения ловить не будет{$зануда off}.
Re: Не могу понять, как писать исключения
Добавлено:
05.11.2023 13:40:25
Leon70
DedFrend писал(а):- Код: Выделить всё
try
.....
result := a/b;
except
on EZerroDivision do writeln('нельзя делить на ноль');
on Exception do writeln('Другая фигня');
end;
А список исключений надо искать среди потомков класса Exception, имя которых принято начинать с буквы E
Странно, но тоже не работает. В Lazarus ругается на do перед writeln, если компилировать в консоли, то вообще не понимает, что такое try и выводит ещё кучу ошибок. Причём делал на разных машинах
Re: Не могу понять, как писать исключения
Добавлено:
05.11.2023 14:38:48
Alexander
> если компилировать в консоли, то вообще не понимает
Нужно добавить
{$MODE OBJFPC}
в начало файла.
Re: Не могу понять, как писать исключения
Добавлено:
05.11.2023 15:20:28
Leon70
Спасибо всем, кто ответил. Кажется я разобрался. Во первых нашёл список с исключениями. В моём случае нужно указать EZeroDivide. Так же, в Lazarus при создании консольного приложения программа сама вписывает в начало файла подключение необходимых пакетов, команд без которых ничего работать не будет. Я поэксперементировал, поудалял некоторые из списка и для моей задачи актуальным оказался {$MODE OBJFPC}, как мне подсказал пользователь Alexander.
Только Lazarus всё равно будет сообщать о возникшем исключении вызвав остановку выполнения программы даже при удачной компиляции, и окно консоли будет пустым. Чтобы извещение в нём появилось нужно нажать снова запуск и извещение 'Делить на ноль нельзя!' в консоли появится, после чего можно закрывать окно консоли. Непонятно где в настройках Lazarus отключить это чтобы не останавливал исполнение программы. А так всё работает. Может кому из новичков пригодится, то прилагаю скан, как всё должно выглядеть.
Re: Не могу понять, как писать исключения
Добавлено:
06.11.2023 13:02:00
iskander
Leon70 писал(а):Только Lazarus всё равно будет сообщать о возникшем исключении вызвав остановку выполнения программы даже при удачной компиляции, и окно консоли будет пустым. Чтобы извещение в нём появилось нужно нажать снова запуск и извещение 'Делить на ноль нельзя!' в консоли появится, после чего можно закрывать окно консоли. Непонятно где в настройках Lazarus отключить это чтобы не останавливал исполнение программы.
Это всё проделки отладчика, кнопка "Запуск"(F9) запускает приложение в отладчике. Можно просто запустить скомпилированное приложение из Проводника или воспользоваться командой "Запустить без отладки"(Shift+Ctrl+F9).
Re: Не могу понять, как писать исключения
Добавлено:
06.11.2023 14:01:04
Sergei I. Gorelkin
В меню "Сервис-Настройка", в категории "Отладчик" есть списки "Исключения языка" и "Исключения ОС", куда можно добавить нужные классы исключений, которые требуется обрабатывать нестандартным образом. В данном случае EZeroDivide относится к исключениям ОС.
Re: Не могу понять, как писать исключения
Добавлено:
07.11.2023 05:34:22
Little_Roo
ЕЯПП, то result - это функция, а не переменная...Даже подчерк ругается... может result в resulttt переименовать...
Re: Не могу понять, как писать исключения
Добавлено:
10.11.2023 00:38:42
slyubez
то result - это функция, а не переменная..
result - это зарезервированное слово языка. Его нельзя использовать в качестве имени чего-то.
По теме. Обычно пишу так:
- Код: Выделить всё
...
try
...
except
on E: Exception do
begin
...
writeln (E.Message);
end;
end;
Добавлено спустя 9 минут 2 секунды:Ну и насчет того, как принудительно вызвать исключение:
- Код: Выделить всё
if b=0 then raise Exception.Create('Message text');
Re: Не могу понять, как писать исключения
Добавлено:
18.11.2023 18:55:12
iskander
Little_Roo писал(а):ЕЯПП, то result - это функция, а не переменная...
slyubez писал(а):result - это зарезервированное слово языка. Его нельзя использовать в качестве имени чего-то.
Есть ложь, но иногда есть ещё и сообщения от
Little_Roo и
slyubez?
Re: Не могу понять, как писать исключения
Добавлено:
13.11.2024 08:11:26
Сквозняк
А иногда делить на 0 нужно и делается это не через исключение а через функцию, проверяющую делитель и заменяющую 0 на нужное число.