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