Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
1-26114
volph
2002-04-24 10:14
2002.05.09
Как узнать есть ли в узле дерева потомок?


6-26205
Fred
2002-02-24 09:16
2002.05.09
Синхронизация времени


4-26305
Delphimun
2002-03-08 08:47
2002.05.09
WinApi in Masm32


6-26217
cypher
2002-02-11 12:08
2002.05.09
Как сделать вот такую вещь...


3-25987
Sam
2002-04-05 19:19
2002.05.09
MySQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский