Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизОбработка ошибок в потоке Найти похожие ветки
← →
r.o.o.t © (2007-10-12 09:48) [0]Господа как обрабатывать ошибки в потоках??
в основных формах понятно
но как это делать в потоках
try
except
end;
это понятно но как обрабатывать исключения например происходящие в сокетах или компанентах созданны на лету...???
в потоке
← →
Kolan © (2007-10-12 10:09) [1]> но как это делать в потоках
Точно так же, а если хочешь уведомить гл. поток об ошибки сделай соотв метод, сохраняй общибку и отправляй её через Synchronize
← →
Leonid Troyanovsky © (2007-10-12 10:20) [2]
> r.o.o.t © (12.10.07 09:48)
> Господа как обрабатывать ошибки в потоках??
http://dn.codegear.com/article/10452
--
Regards, LVT.
← →
Сергей М. © (2007-10-12 10:38) [3]
> но как обрабатывать исключения например происходящие в сокетах
> или компанентах созданны на лету...?
Точно так же как если бы все это творилось в любом ином потоке, в т.ч. основном.
← →
Суслик (2007-10-12 11:06) [4]
> [2] Leonid Troyanovsky © (12.10.07 10:20)
>
> > r.o.o.t © (12.10.07 09:48)
>
> > Господа как обрабатывать ошибки в потоках??
>
> http://dn.codegear.com/article/10452
граммотно.
единственно я не понял зачем сделано так, а не через FatalException и OnTerminate. Имхо автор повторил их функциональность.
← →
r.o.o.t © (2007-10-12 11:14) [5]ну выше приведенные примеры гооврят о
try
except
end;
но мне неоходимо работать с глоальными ошибками например разрыв свзяи сокета его невозможно опистать try except есть компанент ApplicationEvents в методе onExcute можно отловить исключение....
как это делать в потоке??
← →
Leonid Troyanovsky © (2007-10-12 11:19) [6]
> Суслик (12.10.07 11:06) [4]
> единственно я не понял зачем сделано так, а не через FatalException
> и OnTerminate.
Изначально статья была написана во времена D2, IMHO.
Ну, а насчет OnTerminate - не всегда ж надобно Terminate.
Кста, в начале века году оценка у статьи была где-то 1.5 :)
--
Regards, LVT.
← →
Суслик (2007-10-12 11:27) [7]
> Ну, а насчет OnTerminate - не всегда ж надобно Terminate.
эта, ты о чем? OnTerminate всегда вызовется при завершении потока. Посмотри ThreadProc в Classes.pas.
← →
Сергей М. © (2007-10-12 11:31) [8]
> разрыв свзяи сокета его невозможно опистать try except
А у меня возможно.
Что я делаю неправильно ?
← →
r.o.o.t © (2007-10-12 11:34) [9]разрыв свзяи сокета со стороны сервера
ты несможешь описать на клиенте в try except
обычно происходит исключение error reading from soket я говорою про TSocketConnection
← →
Leonid Troyanovsky © (2007-10-12 11:57) [10]
> Суслик (12.10.07 11:27) [7]
> эта, ты о чем? OnTerminate всегда вызовется при завершении
А ты о чем? :)
Не всякое исключение фатально, т.е., не обязательно завершение.
--
Regards, LVT.
← →
Kolan © (2007-10-12 12:05) [11]> [9] r.o.o.t © (12.10.07 11:34)
> разрыв свзяи сокета со стороны сервера
> ты несможешь описать на клиенте в try except
> обычно происходит исключение error reading from soket я
> говорою про TSocketConnection
Я мало знаю про TSocketConnection, но раз есть исключениеerror reading from soket
, с ним и работай.
То есть ты хочешь читать и получаешьerror reading from soket
— значит связь обормалась.
Оч. советую на каждом уровне описыват свои собственные исключения…
← →
Сергей М. © (2007-10-12 12:22) [12]
> я говорою про TSocketConnection
Ну спасибо)
наконец-то ты соизволил сказать, о каком таком сокете идет речь)
> ты несможешь описать на клиенте в try except
Чтой-то вдруг ?
А это что, по-твоемуon E: ESocketConnectionError do Something;
?
> разрыв свзяи сокета со стороны сервера
Разрыв разрыву рознь.
← →
Суслик (2007-10-12 12:26) [13]
>
> [10] Leonid Troyanovsky © (12.10.07 11:57)
>
> > Суслик (12.10.07 11:27) [7]
>
> > эта, ты о чем? OnTerminate всегда вызовется при завершении
>
>
> А ты о чем? :)
тоже верно :)
просто в примере все же фальное исключение моделируется
← →
Anatoly Podgoretsky © (2007-10-12 12:36) [14]
> просто в примере все же фальное исключение моделируется
Для программы это не фатально, посмотри на работу качалок, фтп клиентов, это вообще обычная, легко обрабатываемая ситуация.
← →
r.o.o.t © (2007-10-12 12:40) [15]да так чем отлавливать в потоке
>on E: ESocketConnectionError do Something
на форме я делал через ApplicationEvents
← →
Сергей М. © (2007-10-12 12:47) [16]
> на форме я делал через ApplicationEvents
И что ?
Ну, предположим, это исключение возникло волшебным образом. Что дальше ? Твои действия ?
← →
r.o.o.t © (2007-10-12 12:50) [17]ApplicationEvents
нчинается исполнятся метод onException у данного каомапнета где я отрабатываю исключение. итд
это в том случае если компанентTSocketConnection создан не в потоке
но ежели данный компанент создан в потоке тоApplicationEvents неработает
и соответвенно процедура обработчик несрабатывает как мне одаптировать его к потоку и как мне прерхватывать исключения происходящие в TSocketConnection который создан в потоке
← →
Сергей М. © (2007-10-12 13:03) [18]
> нчинается исполнятся метод onException у данного каомапнета
> где я отрабатываю исключение
Вот я и спрашиваю про твои действия в ходе обработки этого исключения...
> ежели данный компанент создан в потоке тоApplicationEvents
> неработает
Объясни вразумительно, нафих нужен этот ApplicationEvents, если исключение можно (и нужно !) перехватить и обработать в том же потоке ?
Нет, ну решение конечно же есть, и довольно тривиальное, но я не пойму смысла ..
← →
r.o.o.t © (2007-10-12 14:01) [19]короче как мне можно перехватить исключение которое возникает в потоке
без try except
← →
Сергей М. © (2007-10-12 14:08) [20]
> как мне можно перехватить исключение которое возникает в
> потоке
> без try except
Никак.
← →
Сергей М. © (2007-10-12 14:11) [21]
> r.o.o.t © (12.10.07 14:01) [19]
Пока ты вразумительно не объяснишь, что ты намерен делать при обрабтке такого исключения, конктретных рекомендаций не жди.
← →
r.o.o.t © (2007-10-12 14:15) [22]ок
допустим
сервер аварино рвет коннект с клиентом исключение происходит глобально но не в участке кода который можно обрабаоттать try except.
как мне в потоке отлавливать эти исключеня т.е. их возникновение по не по вине клиента а по вине внешнеий стороны....
← →
Anatoly Podgoretsky © (2007-10-12 14:18) [23]> r.o.o.t (12.10.2007 14:01:19) [19]
Перехват исключений делается с помощью try except
← →
r.o.o.t © (2007-10-12 14:27) [24]ходим по кругу
ладно
вопрос ледующий как извлечь всю подробную информацию об исключении
в try except
← →
Kolan © (2007-10-12 14:29) [25]> try except
try
except
on E: Exception do
{E — это и есть исключение. Выбирай всю инфу которую хочешь…}
end;
← →
Сергей М. © (2007-10-12 14:30) [26]
> исключение происходит глобально
Как это "глобально" ? Поясни ..
> но не в участке кода который можно обрабаоттать try except
А почему этот участок кода нельзя заклбчить в блок try..except ?
> как мне в потоке отлавливать эти исключеня т.е. их возникновение
> по не по вине клиента а по вине внешнеий стороны
Ну а какая нафих разница, кто явился "зачинщиком беспорядков" ?
Соединение-то уже не существует ...
А если тебя это таки интересует, то проблема решается либо анализом WSAGetLastError либо парсингом текста с сообщением о причинах исключения.
← →
Сергей М. © (2007-10-12 14:35) [27]
> как извлечь всю подробную информацию об исключении
> в try except
>
Класс исключения знаешь ? Знаешь. Это - ESocketConnectionError.
О наличии публичного св-ва Message у любого наследника класса Exception знаешь ? Знаешь. Следовательно, получить и проанализировать этот текст ты имеешь право и можешь.
Проанализировать SConnect.pas можешь ? Можешь. И сразу увидишь там строчкуraise ESocketConnectionError.Create(SysErrorMessage(WSAGetLastError));
Что тебе мешает в обработчике исключения повторно запросить WSAGetLastError и проанализировать код отказа на интересующий тебя предмет ? Ничто.
Так в чем же дело ?
← →
Сергей М. © (2007-10-12 14:38) [28]
> как извлечь всю подробную информацию об исключении в try except
Можно подумать что ты знаешь "как извлечь всю подробную информацию об исключении в Application.OnException"))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.037 c