Не могу понять, как писать исключения

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Не могу понять, как писать исключения

Сообщение Leon70 » 03.11.2023 08:33:20

Можете смеяться надо мной, но я никак не могу понять, как писать исключения на Object Pascal. Вот такой простой пример, нужно написать исключение при попытке деления на ноль, чтобы выходило сообщение, что делить на ноль нельзя и при компиляции не выскакивала ошибка. Я перерыл уже весь интернет и ни один из вариантов не работает. Пробовал делать это в Lazarus, Geanu, компилил из консоли и ничего не работает.
var
result, a, b : real;
begin
try
a := 10;
b := 0;
result := a / b;
except
writeln('нельзя делить на ноль');
end;
readln;
end.
Вот что в этом коде нужно дописать, поменять чтобы работало? Указать после except саму ошибку? Но как она правильно называется, как правильно её указать? И где найти список всех исключений? Их нигде нет, или не там ищу?
Leon70
незнакомец
 
Сообщения: 5
Зарегистрирован: 02.11.2023 19:15:35

Re: Не могу понять, как писать исключения

Сообщение DedFrend » 03.11.2023 20:35:02

Код: Выделить всё
  try
  .....
    result := a/b;
  except
     on EZerroDivision do  writeln('нельзя делить на ноль');
     on Exception do writeln('Другая фигня');
  end;



А список исключений надо искать среди потомков класса Exception, имя которых принято начинать с буквы E
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: Не могу понять, как писать исключения

Сообщение runewalsh » 04.11.2023 01:27:53

Нужно сделать uses SysUtils;, он занимается преобразованием ситуации, возникающей при делении на 0, в бросание исключения языка EZeroDivision.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Не могу понять, как писать исключения

Сообщение iskander » 04.11.2023 08:51:24

Всё же EZeroDivide, я полагаю.
И, наверно, лучше сказать, что если модуль SysUtils не подключён(прямо или косвенно), блок try except исключения ловить не будет{$зануда off}.
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Не могу понять, как писать исключения

Сообщение Leon70 » 05.11.2023 13:40:25

DedFrend писал(а):
Код: Выделить всё
  try
  .....
    result := a/b;
  except
     on EZerroDivision do  writeln('нельзя делить на ноль');
     on Exception do writeln('Другая фигня');
  end;



А список исключений надо искать среди потомков класса Exception, имя которых принято начинать с буквы E


Странно, но тоже не работает. В Lazarus ругается на do перед writeln, если компилировать в консоли, то вообще не понимает, что такое try и выводит ещё кучу ошибок. Причём делал на разных машинах
Вложения
1.png
Leon70
незнакомец
 
Сообщения: 5
Зарегистрирован: 02.11.2023 19:15:35

Re: Не могу понять, как писать исключения

Сообщение Alexander » 05.11.2023 14:38:48

> если компилировать в консоли, то вообще не понимает

Нужно добавить
{$MODE OBJFPC}
в начало файла.
Аватара пользователя
Alexander
энтузиаст
 
Сообщения: 771
Зарегистрирован: 18.12.2005 19:10:00
Откуда: оттуда

Re: Не могу понять, как писать исключения

Сообщение Leon70 » 05.11.2023 15:20:28

Спасибо всем, кто ответил. Кажется я разобрался. Во первых нашёл список с исключениями. В моём случае нужно указать EZeroDivide. Так же, в Lazarus при создании консольного приложения программа сама вписывает в начало файла подключение необходимых пакетов, команд без которых ничего работать не будет. Я поэксперементировал, поудалял некоторые из списка и для моей задачи актуальным оказался {$MODE OBJFPC}, как мне подсказал пользователь Alexander.
Только Lazarus всё равно будет сообщать о возникшем исключении вызвав остановку выполнения программы даже при удачной компиляции, и окно консоли будет пустым. Чтобы извещение в нём появилось нужно нажать снова запуск и извещение 'Делить на ноль нельзя!' в консоли появится, после чего можно закрывать окно консоли. Непонятно где в настройках Lazarus отключить это чтобы не останавливал исполнение программы. А так всё работает. Может кому из новичков пригодится, то прилагаю скан, как всё должно выглядеть.
Вложения
2.png
2.png (9.93 КБ) Просмотров: 10883
Leon70
незнакомец
 
Сообщения: 5
Зарегистрирован: 02.11.2023 19:15:35

Re: Не могу понять, как писать исключения

Сообщение iskander » 06.11.2023 13:02:00

Leon70 писал(а):Только Lazarus всё равно будет сообщать о возникшем исключении вызвав остановку выполнения программы даже при удачной компиляции, и окно консоли будет пустым. Чтобы извещение в нём появилось нужно нажать снова запуск и извещение 'Делить на ноль нельзя!' в консоли появится, после чего можно закрывать окно консоли. Непонятно где в настройках Lazarus отключить это чтобы не останавливал исполнение программы.

Это всё проделки отладчика, кнопка "Запуск"(F9) запускает приложение в отладчике. Можно просто запустить скомпилированное приложение из Проводника или воспользоваться командой "Запустить без отладки"(Shift+Ctrl+F9).
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Не могу понять, как писать исключения

Сообщение Sergei I. Gorelkin » 06.11.2023 14:01:04

В меню "Сервис-Настройка", в категории "Отладчик" есть списки "Исключения языка" и "Исключения ОС", куда можно добавить нужные классы исключений, которые требуется обрабатывать нестандартным образом. В данном случае EZeroDivide относится к исключениям ОС.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Не могу понять, как писать исключения

Сообщение Little_Roo » 07.11.2023 05:34:22

ЕЯПП, то result - это функция, а не переменная...Даже подчерк ругается... может result в resulttt переименовать...
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Не могу понять, как писать исключения

Сообщение slyubez » 10.11.2023 00:38:42

то 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');
slyubez
постоялец
 
Сообщения: 174
Зарегистрирован: 31.03.2015 08:44:07

Re: Не могу понять, как писать исключения

Сообщение iskander » 18.11.2023 18:55:12

Little_Roo писал(а):ЕЯПП, то result - это функция, а не переменная...

slyubez писал(а):result - это зарезервированное слово языка. Его нельзя использовать в качестве имени чего-то.

Есть ложь, но иногда есть ещё и сообщения от Little_Roo и slyubez?
iskander
энтузиаст
 
Сообщения: 606
Зарегистрирован: 08.01.2012 18:43:34

Re: Не могу понять, как писать исключения

Сообщение Сквозняк » 13.11.2024 08:11:26

А иногда делить на 0 нужно и делается это не через исключение а через функцию, проверяющую делитель и заменяющую 0 на нужное число.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru