Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
ВнизThread and Exception Найти похожие ветки
← →
AlexNx (2004-01-22 11:57) [0]Народ! Почему если в новом классе наследованом Thread возникает ошибка, то она не райзится.В частности делаю Indy SMTP Client
SMTP.Connected := True;
в обычном приложении если не верно указан хост, то вылетает ошибка, а в Thread классе - ничего... При дебаге вылазит, а в работающем виде нет.
← →
jack128 (2004-01-22 12:02) [1]см модуль SConnect procedure TTransportThread.Execute; там показано, как переправить исключение в основной поток, а там уж с ним чего хошь делай.
← →
Digitman (2004-01-22 12:05) [2]
> в новом классе ..возникает ошибка
абсурд.
исключение возбуждается не в классе (каким бы он ни был), а ходе исполнения одного из его методов в контексте конкретного кодового потока
все прекрасно "райзится" ... "ловить" просто исключения ты не умеешь, видимо ..
try
SMTP.Connected := True;
except
on e: exception do
messagebox(0, PChar(e.Classname + " " + e.message), "Программное исключение", mb_ok or mb_setforeground);
end;
← →
AlexNx (2004-01-22 12:10) [3]>Digitman
Так вот и ничего подобного!
Аналогичный код НЕ РАБОТАЕТ!!!
При дебаге все ОК, а в реальном приложении если ошибка повторяется, то да, она райзится. Только потом когда закрываешь приложение возникает новое исключение, типа Invalid window handle...
← →
Digitman (2004-01-22 12:16) [4]
> Аналогичный код НЕ РАБОТАЕТ!!!
приводи дословно свой "аналогичный код"
еще лучше - полный текст метода Execute
> При дебаге все ОК
что означает ОК ? попадаешь на строчку on e:Exception ? или что ?
← →
AlexNx (2004-01-22 12:21) [5]>Digitman
on E: Exception do
begin
Result := False;
MessageDlg(sCannotConnectToSMTPServer, mtWarning, [mbOK], 0);
raise;
end
← →
Erik (2004-01-22 12:26) [6]Ха-ха-ха ничего себе аналогичный!!! А может мы наведем курсрр на MessageDlg и нажмем F1? Советую посмотреть в кокой help попадем. Врядли это будет win32. :) Неплохо бы знать в чем состоит понятие ThreadSafe(потоко безопасный код).
← →
Digitman (2004-01-22 12:27) [7]ну и где же "аналогичный код" ?
я же сказал тебе - MessageBox() !! Что отсебячину-то пишешь ?
во-вторых, я просил привести полный текст метода Execute
← →
AlexNx (2004-01-22 12:27) [8]УПС!!!
Мои извинения Digitman!!!
Если выводить ошибку через MessageBox, то все ОК...
А в чем дело? Если не сложно объясни...
← →
Digitman (2004-01-22 12:28) [9]MessageDlg(sCannotConnectToSMTPServer, mtWarning, [mbOK], 0);
raise; //еще одна "отсебячина" !
← →
Digitman (2004-01-22 12:32) [10]
> Если не сложно объясни
в 2-х словах :
MessageDlg() создает VCL-объект-форму и визуализирует ее в мод.режиме ... VCL-форма - не потокобезопасный VCL-объект и требует синхронизации обращений к его св-вам/методам с осн.код.потоком
MessageBox() же - это чисто WinAPI-ф-ция, вызов ее в доп.код.потоке без синхронизации с основным код.потоком практически всегда безопасен
← →
AlexNx (2004-01-22 12:33) [11]ок. весь текст той процедуры, где происходит ошибка
function TEMailSender.DoAdditionalProcedure: boolean;
begin
FProgressForm.Caption := Format(FormCaption,
[round(FProgressBar.Position / FProgressBar.Max * 100)]);
PrepareEMail;
Result := True;
try
FSMTP.Connect();
except
on E: Exception do
begin
Result := False;
ErrorCaption := sCannotConnectToSMTPServer;
MessageBox(0, PChar(sCannotConnectToSMTPServer), "Программное исключение",
MB_OK OR MB_SETFOREGROUND OR MB_ICONERROR);
raise;
Может я чего не понимаю, но ведь код то дальше пойдет выполняться. А это не нужно!
end
end;
try
try
FSMTP.Send(FMailMessage);
except
on E: Exception do
begin
Result := False;
ErrorCaption := Format(sCannotSendEMail, [E.Message]);
MessageBox(0, PChar(ErrorCaption), "Программное исключение", mb_OK OR MB_SETFOREGROUND);
raise;
MessageDlg
end
end;
finally
FSMTP.Disconnect;
end;
end;
← →
AlexNx (2004-01-22 12:34) [12]>Digitman
Спасибо. Все понял...
← →
Digitman (2004-01-22 12:41) [13]
> FProgressForm.Caption :=
еще одна твоя грубая ошибка - обращение к VCL-объекту без синхронизации
> raise;
> Может я чего не понимаю, но ведь код то дальше пойдет выполняться.
> А это не нужно!
ну так и пиши Exit ! почему raise-то ?
непреложное правило таково : программные исключения, потенциально ожидаемые в ходе выполнения Execute() НИ в коем случае НЕ должны "выпускаться" тобой за пределы контекста этого метода... т.е. все что творится в Execute, д.б. заключено во внешнеокаймляющий блок перехвата/обработки ЛЮБЫХ исключений, которые могут возникнуть :
try
.. // здесь у тебя все что угодно может твориться
except
// но здесь никаких raise не допустимы !
end;
← →
AlexNx (2004-01-22 12:53) [14]Профан в многопоточных приложениях... Учусь.
А где про многопоточные почитать-то?
← →
Erik (2004-01-22 13:17) [15]Лучше Рихтера ничего нет, но примеры на С++. К томуже там много про OS написано. Основное тебе сказали тред взвимодействует с остальным кодом подругому!
← →
Андрей Сенченко (2004-01-22 13:19) [16][13]
относится не только к многопоточности. Ко всему в принципе.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c