Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2008, 23:36   #1
Rifler
Пользователь
 
Регистрация: 15.12.2007
Сообщений: 44
По умолчанию Исключения

Здраствуйте

Разбираюсь с исключениями, накалякал такой пример
Код:
procedure TForm1.Button1Click(Sender: TObject);
var d,x: extended;
begin
try    d:=0;
       x:=5/d;
   except
       on Excp : EZeroDivide	do
           ShowMessage('Ошибка под названием - '+Excp.Message)
       else
           ShowMessage('Другая ошибка');
   end;
end;
Не работает
Но как только добавляю гениальную строчку Form1.Caption:=FloatToStr(x); все начинает работать:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var d,x: extended;
begin
try    d:=0;
       x:=5/d;
       Form1.Caption:=FloatToStr(x);
   except
       on Excp : EZeroDivide	do
           ShowMessage('Ошибка под названием - '+Excp.Message)
       else
           ShowMessage('Другая ошибка');
   end;
end;
В чем причина, не могу понять. Объясните плиз
Уже бьюсь головой об стену
Rifler вне форума Ответить с цитированием
Старый 12.11.2008, 00:01   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Эт оптимизация виновата. В первом случае переменная х нигде не используется, поэтому компилятор её не включает в конечный код - вот и нет ошибки! Во втором случае переменная включается в код, т.к. она дальше используется - вот тут всё "логично"
eoln вне форума Ответить с цитированием
Старый 12.11.2008, 00:02   #3
Rifler
Пользователь
 
Регистрация: 15.12.2007
Сообщений: 44
По умолчанию

Спасибо большое
Rifler вне форума Ответить с цитированием
Старый 12.11.2008, 00:10   #4
Rifler
Пользователь
 
Регистрация: 15.12.2007
Сообщений: 44
По умолчанию

а такой пример
Код:
a:=56;
  b:=a/0;
  c:=a/b;
b дальше вроде бы используется, но все равно исключения нет
Rifler вне форума Ответить с цитированием
Старый 12.11.2008, 00:18   #5
maxvodo.dll
Пользователь
 
Аватар для maxvodo.dll
 
Регистрация: 24.10.2008
Сообщений: 17
По умолчанию

и действительно странно. деление на ноль - мгновенное EZeroDivide.
Может стоит покапаться в Tools - DebuggerOptions - OSExceptions
maxvodo.dll вне форума Ответить с цитированием
Старый 12.11.2008, 00:29   #6
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

c нигде не используется дальше...
Всё та же оптимизация. Откомпилируйте код и посмотрите, что около этих строк нет отметок слева (синих точек нет). Или пошагово программу пройдите - результат вас убедит

Добавлено
Свойства проекта - вкладка компилятор - уберите оптимизацию, тогда всё будет "как нужно"

Последний раз редактировалось eoln; 12.11.2008 в 00:33.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оператор исключения Titan123 Общие вопросы Delphi 12 08.07.2008 14:30
Нужна программа исключения списков строк AFOMENKO Фриланс 8 11.12.2007 00:22