Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-53686
webpauk
2003-12-15 13:30
2004.02.17
определение OS на компах в сети


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


8-53655
Jee
2003-07-30 15:05
2004.02.17
Тоновый набор


1-53586
KSergey
2004-02-06 07:41
2004.02.17
Создание объектов для потока


1-53455
Dik
2004-02-06 15:51
2004.02.17
TRichEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский