Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.17;
Скачать: CL | DM;

Вниз

Не отрабатываются исключительные ситуации   Найти похожие ветки 

 
leonidus   (2004-02-01 11:58) [0]

Переустановил винду и Delphi, после чего перестали обрабатываться исключительные ситуации, в частности EZeroDivide.
Например код:
try
res:=(random(10)+1)/delta;
except
on EZeroDivide do
begin
...
end;

Если delta=0 обработчик не срабатывает. Я помню что-то выставлял в настройках Tools > Debugger Options > OS Exceptions но тогда как-то больше методом научного втыка делал, а сейчас не помню. Мастера подскажите пожалуйста, очень нужно!!!


 
Anatoly Podgoretsky ©   (2004-02-01 12:19) [1]

А если убрать on EZeroDivide do


 
Ihor Osov'yak ©   (2004-02-01 12:35) [2]

два варианта. Вариант первый - Вы путаете перехват исключений IDE и обработку исключений (первое зависит от настроек IDE).
Второе - если в состав пректа не включить SysUtils - то код в cекции except срабатывать не будет - здесь, кажется, это уже пытались обсуждать... Но, раз Вы используете EZeroDivide, то SysUtils у Вас включен. :-). Так что думаю, все же вариант первый.


 
leonidus   (2004-02-01 12:58) [3]

>Anatoly Podgoretsky on EZeroDivide do убрать нельзя, я просто кусок кода привел.
>Ihor Osov"yak да SysUtils включен в проект, мне вообще-то надо и что бы IDE перехватывал исключения (на этапе разработки программы) и конечный продукт работающий не из под отладчика тоже обрабатывал исключения, так что мне надо сделать?


 
Anatoly Podgoretsky ©   (2004-02-01 13:03) [4]

Убрать можно, можешь проверить.


 
Hooch ©   (2004-02-01 13:10) [5]


> если в состав пректа не включить SysUtils - то код в cекции
> except срабатывать не будет


это как так ??? у меня без SysUtils срабатывает


 
Ihor Osov'yak ©   (2004-02-01 13:25) [6]


2 [5] Hooch © (01.02.04 13:10)

program Project1;
{$APPTYPE CONSOLE}
//uses SysUtils;
var
res: real;
delta: integer;
begin

delta := 0;
try
res := (random(10) + 1) / delta;
except
//on EZeroDivide do
//begin
Writeln("oops");
//end;
end;
writeln("Enter, please");
ReadLn;
end.


Обрабатывает, не обрабатывает - не знаю, но неадекватно себя поводит - хвакт. Лицизреть oops, выведенное на экран - не получается.. Как и "Enter, please". Наблюдаем элементарный вылет по рантайм ерору..

В общем-то, для меня это также было неожиданностью.
Здесь на форуме было жаркое обсуждение этого факта - к сожалению, я исчез на несколько дней, и окончания дисскуссии не отследил.. На досуге нужно будет поискать за этой веткой.
Зы, может кто-то линк сохранил, буду признателен..


 
Hooch ©   (2004-02-01 13:41) [7]

мда, факт имеет место быть :-)


 
viajero   (2004-02-01 15:43) [8]

Насколько я понимаю, вся работа с эксепшнами
ведётся через указатели на процедуры, объявленные в
System.pas:


var
ExceptProc: Pointer; { Unhandled exception handler }
ErrorProc: procedure (ErrorCode: Byte; ErrorAddr: Pointer); { Error handler procedure }
{$IFDEF MSWINDOWS}
ExceptClsProc: Pointer; { Map an OS Exception to a Delphi class reference }
ExceptObjProc: Pointer; { Map an OS Exception to a Delphi class instance }

// и так далее

А инициализируются все эти указатели в SysUtils initialization.
Поэтому, вероятно, без SysUtils обработка исключений и не работает.

Что касается EZeroDivide - может, дело в настройках сопроцессора? -
(это если исключения не только не перехватываются, но и не
возникают совсем).
Тогда можно поиграться Math.SetExceptionMask


 
Германн ©   (2004-02-01 22:21) [9]

2 leonidus (01.02.04 12:58) [3]
>мне вообще-то надо и что бы IDE перехватывал исключения (на >этапе разработки программы) и конечный продукт работающий не из >под отладчика тоже обрабатывал исключения, так что мне надо >сделать?

Поставить галочку у Stop on Delphi Exceptions. Остальное уже вроде есть.


 
Плохиш   (2004-02-01 22:39) [10]

>Ihor Osov"yak © (01.02.04 13:25) [6]

res = INF

В общем-то, для меня это также было неожиданностью

С год назад для меня тоже :-)


 
Anatoly Podgoretsky ©   (2004-02-01 22:44) [11]

Плохиш (01.02.04 22:39) [10]
Это уже не ошибка, а +- бесконечность, еще может быть неопределенность NAN, помоему при 0/0


 
Плохиш   (2004-02-01 22:47) [12]


> Anatoly Podgoretsky © (01.02.04 22:44) [11]
> Плохиш (01.02.04 22:39) [10]
> Это уже не ошибка, а +- бесконечность, еще может быть неопределенность
> NAN, помоему при 0/0

Я знаю :-) Тогда же и в справке почитал :-)))


 
leonidus   (2004-02-01 23:10) [13]

>Германн в каком смысле "Stop on Delphi Exceptions", это вообще где?
На сколько я помню я настраивал тут: Tools > Debugger Options > OS Exceptions, но сейчас не врубаюсь, там когда выбираешь исключение можно перекинуть checkbox в положение "Run handled" или "Run unhandled" плюс еще есть переключатели "Debugger" и "User program" мне кажется это что-то надо с ними делать для каждой конкретной исключительной ситуации, но что именно?
Кстати а если отключить опцию "Integrated debugging" то что тогда IDE вообще перестанет ловить исключения?
Подскажите пожалуйста а то проект горит, обидно из-за такой фигни по шее получать:(


 
Ihor Osov'yak ©   (2004-02-02 01:32) [14]

2 Плохиш, Anatoly Podgoretsky

Да нет, я не имел ввиду премудрости арифметики для случая деления на нуль. Я имел ввиду, что в случае включения модуля SysUtils код внутри except получит управления в случае исключительной ситуации, если же не включить - нет. Версия [8] viajero (01.02.04 15:43) выглядит довольно правдоподобной, нужно будет на досуге разобраться.. Может :-(.


 
Ihor Osov'yak ©   (2004-02-02 01:46) [15]

2 [13] leonidus (01.02.04 23:10)

Сорри, у тебя какой-то более новый дельф чем у меня, наверное 6 или 7, я еще не дорос, поэтому конкретного ответа не будет. Если же вокруг да около - то вероятнее всего эти настройки влияют на работу проекта под иде, поведение скомпилированного проекта у заказчика от этих настроек зависить не будет.
Судя по названиям - "Debugger" - среда будет ловить исключения, "User program" - среда не будет вмешиваться в обработку исключений - то есть поведение должно быть, как в случае запуска не из-под среды..
Относительно Run - не соображу.. Да, и собственно в чем проблема? нажать ф1 трудно? Или перепробывать четыре разных варианта со всеми возможными положениями этих радиобутонов, если ф1 не судьба? Ей-богу, не понимаю...


 
Плохиш   (2004-02-02 01:48) [16]


> Ihor Osov"yak © (02.02.04 01:32) [14]

Имелось ввиду, что для процессора деление на постоянную 0 не является нештатной ситуацией и по-этому исключение не возникает


 
Ihor Osov'yak ©   (2004-02-02 02:03) [17]

2 [16] Плохиш (02.02.04 01:48)

Ну, если мне не изменеят память - это в зависимости от режима работы, и то только на более новых - я точно говорить не буду, ибо детально изучал процессоры еще в те времена, когда они 16 битными были, сейчас - постольку посколько..
Но я поступил проще - код, приведенный в [6], скомпилировал и запустил раз с закоментированным uses SysUtils; другой раз - с включенным. И Вам бы советовал это сделать. И попытайтесь увидить разницу в работе этих по разному собранных примерах.

Зы. Я, между прочим, ни словом не говрил о INF и иже с ним. Я спич вел только о том, что без SysUtils идет неадекватная обработка except.
Возможно, что пример с делением на нуль - неудачен, не спорю. Он был взят с попичного постинга.


 
Ihor Osov'yak ©   (2004-02-02 02:11) [18]

Да, здесь имеем дело собственно не с целочисельным делением.. То есть здесь будеть заправилой сопроцессор.
Но и не в том суть.. Суть в том, что ислючительная ситуация возникает, а без sysutils обработка ее неадекватна...


 
leonidus   (2004-02-08 10:36) [19]

Всем большое спасибо



Страницы: 1 вся ветка

Текущий архив: 2004.02.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.019 c
1-53643
VID
2004-02-06 17:08
2004.02.17
Определить необходиму высоту для RichEdit


14-53750
SemFLY
2004-01-27 01:27
2004.02.17
Посоветуйте книжку(и) для изучения ОС семейства UNIX...


3-53402
suric
2004-01-26 15:12
2004.02.17
InterBase и хранимые процедуры


1-53618
garry79
2004-02-07 12:31
2004.02.17
Как двигать мешающую мне форму при отладке?


4-53803
Kinder
2003-12-13 00:12
2004.02.17
XP Иконки в менюшках