Форум: "Основная";
Текущий архив: 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.006 c