Страница 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 на нужное число.