![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка исключений в сервисе [D2005, XP, 2003]
ViToTiV © (2008-10-29 17:25:00)Подскажите пжлста, как в сервисном приложении обрабатывать его ишибки/исключения? У меня приложение раньше было обычным, исключения обрабатывал путём:
Application.OnException := MyExceptionHandler;
Но теперь неда это приложение переделать в сервис, а там нет события "Application.OnException" :(
Anatoly Podgoretsky (2008-10-31 12:19:00) [1]
> Но и расставлять их на каждом шагу и по каждому чиху тоже
> вряд ли оправдано.
Зависит от сервиса, возможно еще и более жестко, если сервис должен выживать при любых ситуациях, кроме отсутствие критически важно внешнего ресурса, да и это тоже должен выдерживать.
Сергей М. (2008-10-31 11:53:00) [2]
> Slym © (31.10.08 11:44) [16]
> без должной защиты получишь только уведомление об ошибке
> - выполнение освобождающего ресурсы кода прервалось - сушите
> весла
>
Ну это еще надо постараться, чтобы таким веслом огрести)
То что в действительно критичных к жизнеспособности сервиса точках алгоритма должны быть расставлены местные индивидуальные ловушки исключений - это бесспорно. Но и расставлять их на каждом шагу и по каждому чиху тоже вряд ли оправдано.
Slym (2008-10-31 11:44:00) [3]Сергей М. © (31.10.08 8:42) [15]
если вся работа идет внутри цикла и нет вызовов прочих процедур в которых захватываются ресурсы - то да
а если происходят операции по захвату ресурсов: открытие файлов, подключения к дб, прочие захваты "власти"... то без должной защиты получишь только уведомление об ошибке - выполнение освобождающего ресурсы кода прервалось - сушите весла
Сергей М. (2008-10-31 08:42:00) [4]
> и поймаешь уведомление об ошибке
Чтой-то вдруг ?
В очередной итерации я схлопотал исключение, тут же поймал его, проанализировал (если таковое возможно - а почему бы и нет ?) его причину и возможные последствия и тут же принял решение: выходить ли из цикла, возобновить ли цикл или рерайзить
Первый вариант ведет к корректному (штатному) завершению сервиса, третий - к аварийному ("падение"), второй - продолжение нормальной работы..
Slym (2008-10-31 04:52:00) [5]Сергей М. © (30.10.08 14:52) [13]
и поймаешь уведомление об ошибке... а саму ошибку уже поздно исправлять, а они имеют свойство накапливаться (например открытые хендлы) и при достижении определенного порога все ляжет...
Ошибку ловить и исправлять или устранять ее последствия нужно по месту там где еще известно по какому поводу шухер
Сергей М. (2008-10-30 14:52:00) [6]
> ViToTiV (30.10.08 14:43) [12]
> придётся везде вручную ловить
Зачем везде ?
Вполне достаточно будет в одном месте - обрамить тело цикла в TService.OnExecute в try..except
ViToTiV (2008-10-30 14:43:00) [7]Мне главное что бы не падал сервис, он выполняет много функций, и если в одной из них произойдёт не предвиденное действие, нужно что бы всё остально работало дальше.
Вообщем я понял, значит придётся везде вручную ловить. Спасибо.
Сергей М. (2008-10-30 11:19:00) [8]
> Anatoly Podgoretsky © (30.10.08 11:09) [10]
Ну это да, само собой разумеется
Anatoly Podgoretsky (2008-10-30 11:09:00) [9]> Сергей М. (30.10.2008 9:57:09) [9]
Важно, что бы сервис не падал, от некритических исключений.
Сергей М. (2008-10-30 09:57:00) [10]
> Slym © (30.10.08 09:41) [8]
Автор, видимо, для протоколирования это надо..
Если так, то и делать ничего не надо - протоколирование непредвиденных исключений в TService и TServiceThread уже предусмотрено
Slym (2008-10-30 09:41:00) [11]Application.OnException - носит сугубо уведомительный характер, и не защищает от последствий...
Сервис-не зависит от пользователя и уведомлять "Нажмите на меня" некого, к томуже сервис - это 24/7/365 приложение и незащищенные от исключений объекты находятся под угрозой с дальнейшим падением сервиса а возможно и всей системы
Сергей М. (2008-10-30 08:51:00) [12]
> ViToTiV (29.10.08 17:25)
Централизованного пользовательского "перехватчика" исключений с возможностью их "гашения" класс TServiceThread не предусматривает.
Придется реализовывать их самостоятельно в каждом из обработчиков событий класса TService.
Slym (2008-10-30 06:00:00) [13]Сергей М. © (29.10.08 22:36) [5]
У кого чего болит тот о том и говорит?
Сергей М. (2008-10-29 22:36:00) [14]
> tesseract © (29.10.08 20:54) [4]
> Рекомендуеться всё проводить вручную
Чтой-то вас, батенька, к вечеру на "ручное" потянуло ?)
Уж не поссорились ли со спутницей ?)
tesseract (2008-10-29 20:54:00) [15]
> как было у меня "Application.OnException := MyExceptionHandler"
> нельзя теперь повесить процедуру?
В delphi к сожалению Assert и отлов не очень развит. Рекомендуеться всё проводить вручную - зато получишь бесценный опыт разработки приложеий 24/7.
Сергей М. (2008-10-29 20:15:00) [16]А нахрен тебе "на любое" ?
Ты свое"лови", а не любое ..
А "любое" ловят батоношлёпы) ..
Ты "батоношлёп" ? Нет ?
Вот и лови "своё".
ViToTiV (2008-10-29 18:01:00) [17]Но это тогда каждый раз придётся делать, а на любое исключение, как было у меня "Application.OnException := MyExceptionHandler" нельзя теперь повесить процедуру?
Ega23 (2008-10-29 17:28:00) [18]
try
....
except on E : Exception do
Log(.... + E.Message);
end;