Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизНе отрабатываются исключительные ситуации Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c