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

Вниз

try..except не работает   Найти похожие ветки 

 
Basilio   (2002-04-23 16:59) [0]

почему-то блок try..except не обрабатывает исключения
(или обрабатывает, но не все)
вот кусок кода:

(в главной форме)
try
...
MyForm:=TMyForm.Create(self);
...
except
ShowCrashMsg;
end;
...

внутри TMyForm возбуждается исключение EConvertError
(функция FileDateToDateTime для неправильной даты)
except не ловит это исключение.
если я поставлю

try
DOSDateTime:=FileGetDate(Handle); // для несущ. файлов handle=-1
DateTime:=FileDateToDateTime(DOSDateTime);
except
ShowCrashMsg;
end;

внутри TMyForm.Create, то исключение ловится именно в этом месте,
а не на уровень выше (по вложенности вызовов).
почему не работает на более верхнем уровне?


 
ZZ   (2002-04-23 17:06) [1]

попробуй
except
on EConvertError do ShowCrashMsg;

или
except
else ShowCrashMsg;


 
Basilio   (2002-04-23 17:13) [2]

Нет, не работает. проверял. оба варианта.
Может, это такая хитрая система обработки конструкторов?
и вообще, если я уберу блок try..catch, программа не свалится
на TMyForm.Create даже после возникновения там исключения.
будет работать, как будто ничего не случилось.
а исключение ловится ТОЛЬКО отладчиком борланда
в run-time его как бы и нету


 
AlexanderSK   (2002-04-23 17:13) [3]

А исключение возбуждается при создании формы?


 
Basilio   (2002-04-23 17:26) [4]

при создании какой формы?
если я отладчиком иду по коду, то, нажимая F8 на строке

MyForm:=TMyForm.Create(self);

Получаю исключение.
Может есть какой-то флаг у компилятора, чтобы программа не падала при
возбуждении исключений (надо, чтобы падала)
А то она "глотает" исключения и ничего с ней не поделать.. :(


 
Song   (2002-04-23 17:33) [5]

Исключение не генерируется при создании формы, даже если в этой строчке ошибка. Исключение будет генерироваться тогда, когда Вы будете пытаться что-то сделать с неправильно созданной формой т.е. обычно исключение описывают так:
<code.
With TForm.Create(nil) Do
try
// Здесь что-то делаем
finally
Free;
end;

На самой TForm.Create(nil) даже если что-то неправильно ошибки не будет, а дальше исключение обработается без проблем.


 
Basilio   (2002-04-23 17:34) [6]

Только что написал в конструкторе TMyForm.Create такую вещь:

i:=0;
i:=i div i;

Отладчик словил исключение, однако когда я запустил exe-шник
отдельно от отладчика, он не свалился. (программа имеет консоль
и на ошибках ввода-вывода EIOException она туда выдавала и нормально валилась. сейчас почему-то
и этого не делает)


 
Song   (2002-04-23 17:39) [7]

Посмотрите Tools\Debugger\Language exception


 
Basilio   (2002-04-23 17:41) [8]

Хмм.. тестирование показало, что исключения не ловятся
не только в конструкторе, но и в Show, ShowModal, Close, FormActivate и в
тому подобных мрачных местах


 
Игорь Шевченко   (2002-04-23 17:48) [9]

День добрый, Basilio ©,

Ловятся :-)

С уважением,


 
Basilio   (2002-04-23 17:49) [10]

[x] VCL EAbort Exception
[x] Microsoft DAO Exceptions
[x] VisiBroker Exception
[x] CORBA System Exceptions
[ ] CORBA User exceptions



[ ] Stop on Delphi Exceptions

Что здесь изменить?


 
Song   (2002-04-23 17:54) [11]

Крестик поставить в нижней галочке


 
Basilio   (2002-04-23 17:58) [12]

Хмм.. на другом проекте (маленький) работает,
но на основном (4 МБ исходников) не работает :(


 
Song   (2002-04-23 18:00) [13]

IDE бастует :-)


 
Basilio   (2002-04-23 18:19) [14]

Может, у меня винда глючит, но исключения не ловятся
НИ В ОДНОМ обработчике типа OnShow, OnCreate, OnActivate
только что засунул деление на ноль в TForm2.Show
и съела.. ничего не сказала.
(новый проект: форма TForm1 - по умолчанию,
на ней одна кнопка, по нажатии которой form2.show.
в TForm2 кнопка закрытия формы и поле Edit1
в TForm2.Show написано:
Edit1.Text:="Hello1"; i:=0; i:=i div i; Edit1.Text:="Hello2";
По нажатии кнопочки показа form2 НИЧЕГО НЕ ПРОИСХОДИТ
может, это оптимизатор меня перехитрил (код выбросил)?? (поле Edit1 имеет значение "Hello2" после показа формы)


 
Malder   (2002-04-23 19:07) [15]

Basilio, если на маленьких проектах ловится, а на больших нет, вывод один - ты просто не знаешь полностью большой проект. Вероятно, так где то обрабатываются все Exception"ы. Или указание компилятору есть - не выдавать Exception"ы...


 
Basilio   (2002-04-23 19:12) [16]

Возможно. моя доля в проекте -- около 20%. может, кто с указателями
нечисто работает. В общем, начальство велело отложить борьбу
с исключениями и делом заниматься. :)


 
Basilio   (2002-04-24 12:40) [17]

В общем нашел, в чем глюк: (Malder оказался прав) модуль AppEvnts
перенаправляет на СЕБЯ обработчик Application.OnException.
AppEvnts входит в состав Delphi. можно ли как-нибудь его заставить
этого не делать? у AppEvnts в секции initialization стоит
MultiCaster := TMultiCaster.Create(Application);
а в самом конструкторе Create стоит перенаправление обработчиков.
Естественно, править AppEvnts разработчики (мы) не в праве
Может, у них есть какой-нибудь параметр? (Написание собственного
обработчика неприемлемо). <p>
если в примере с двумя простыми формами (см. выше) в секции
uses второй формы (модуля) поставить AppEvnts, то получится
желаемый эффект, т.е: debugger ловит исключения, а сама программа - нет.


 
Игорь Шевченко   (2002-04-24 13:05) [18]

День добрый,

Не совсем понятно, в чем проблема:


{ Occurs when an unhandled exception occurs in the application.}

procedure TCustomApplicationEvents.DoException(Sender: TObject;
E: Exception);
begin
if E is Exception then
begin
if not (E is EAbort) then
if Assigned(FOnException) then
FOnException(Sender, E)
else
Application.ShowException(E);
end else
SysUtils.ShowException(E, ExceptAddr);
end;


Почему программа не ловит-то ? try/except должны раньше срабатывать...

С уважением,


 
Anatoly Podgoretsky   (2002-04-24 13:09) [19]

Может прислушаться к мнению начальство, оно явно трезвомыслящее.


 
McSimm   (2002-04-24 13:32) [20]

Возможно надо поставить апдейты на Делфи.
У меня 5.0 (Build 6.18) Update Pack 1
Исключение срабатывает независимо от наличия AppEvents.

Добавлю также - настройки Debugger Options не влияют на работу приложения, только на работу IDE Делфи.


 
Donal_Graeme   (2002-04-24 17:59) [21]


> внутри TMyForm.Create, то исключение ловится именно в этом
> месте,
> а не на уровень выше (по вложенности вызовов).
> почему не работает на более верхнем уровне?


Если вопрос всё-таки именно в этом, то попробуй сделать

try
...
except
...
Raise;
end;



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

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

Наверх




Память: 0.52 MB
Время: 0.013 c
1-26106
Сатир
2002-04-26 18:44
2002.05.09
Как попасть в исходники?


14-26244
Baz
2002-03-28 15:25
2002.05.09
WEB-программирование


14-26256
111
2002-03-31 22:45
2002.05.09
Win3.11 ;)


3-26035
Pike
2002-04-04 23:49
2002.05.09
Позиционирование в DBGrid после Insert


14-26267
kosty
2002-03-30 18:25
2002.05.09
интернет