Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.07;
Скачать: CL | DM;

Вниз

Обработка исключений в сервисе   Найти похожие ветки 

 
ViToTiV   (2008-10-29 17:25) [0]

Подскажите пжлста, как в сервисном приложении обрабатывать его ишибки/исключения? У меня приложение раньше было обычным, исключения обрабатывал путём:
Application.OnException := MyExceptionHandler;
Но теперь неда это приложение переделать в сервис, а там нет события "Application.OnException" :(


 
Ega23 ©   (2008-10-29 17:28) [1]

try
 ....
except on E : Exception do
 Log(.... + E.Message);
end;


 
ViToTiV   (2008-10-29 18:01) [2]

Но это тогда каждый раз придётся делать, а на любое исключение, как было у меня "Application.OnException := MyExceptionHandler" нельзя теперь повесить процедуру?


 
Сергей М. ©   (2008-10-29 20:15) [3]

А нахрен тебе "на любое" ?
Ты свое "лови", а не любое ..
А "любое" ловят батоношлёпы) ..
Ты "батоношлёп" ? Нет ?
Вот и лови "своё".


 
tesseract ©   (2008-10-29 20:54) [4]


> как было у меня "Application.OnException := MyExceptionHandler"
> нельзя теперь повесить процедуру?


В delphi к сожалению Assert  и отлов не очень развит. Рекомендуеться всё проводить вручную  - зато получишь бесценный опыт  разработки приложеий 24/7.


 
Сергей М. ©   (2008-10-29 22:36) [5]


> tesseract ©   (29.10.08 20:54) [4]


> Рекомендуеться всё проводить вручную


Чтой-то вас, батенька, к вечеру на "ручное" потянуло ?)
Уж не поссорились ли со спутницей ?)


 
Slym ©   (2008-10-30 06:00) [6]

Сергей М. ©   (29.10.08 22:36) [5]
У кого чего болит тот о том и говорит?


 
Сергей М. ©   (2008-10-30 08:51) [7]


> ViToTiV   (29.10.08 17:25)  


Централизованного пользовательского "перехватчика" исключений с возможностью их "гашения" класс TServiceThread не предусматривает.
Придется реализовывать их самостоятельно в каждом из обработчиков событий класса TService.


 
Slym ©   (2008-10-30 09:41) [8]

Application.OnException - носит сугубо уведомительный характер, и не защищает от последствий...
Сервис-не зависит от пользователя и уведомлять "Нажмите на меня" некого, к томуже сервис - это 24/7/365 приложение и незащищенные от исключений объекты находятся под угрозой с дальнейшим падением сервиса а возможно и всей системы


 
Сергей М. ©   (2008-10-30 09:57) [9]


> Slym ©   (30.10.08 09:41) [8]


Автор, видимо, для протоколирования это надо..
Если так, то и делать ничего не надо - протоколирование непредвиденных исключений в TService и TServiceThread уже предусмотрено


 
Anatoly Podgoretsky ©   (2008-10-30 11:09) [10]

> Сергей М.  (30.10.2008 9:57:09)  [9]

Важно, что бы сервис не падал, от некритических исключений.


 
Сергей М. ©   (2008-10-30 11:19) [11]


> Anatoly Podgoretsky ©   (30.10.08 11:09) [10]


Ну это да, само собой разумеется


 
ViToTiV   (2008-10-30 14:43) [12]

Мне главное что бы не падал сервис, он выполняет много функций, и если в одной из них произойдёт не предвиденное действие, нужно что бы всё остально работало дальше.
Вообщем я понял, значит придётся везде вручную ловить. Спасибо.


 
Сергей М. ©   (2008-10-30 14:52) [13]


> ViToTiV   (30.10.08 14:43) [12]



> придётся везде вручную ловить


Зачем везде ?
Вполне достаточно будет в одном месте - обрамить тело цикла в TService.OnExecute в try..except


 
Slym ©   (2008-10-31 04:52) [14]

Сергей М. ©   (30.10.08 14:52) [13]
и поймаешь уведомление об ошибке... а саму ошибку уже поздно исправлять, а они имеют свойство накапливаться (например открытые хендлы) и при достижении определенного порога все ляжет...
Ошибку ловить и исправлять или устранять ее последствия нужно по месту там где еще известно по какому поводу шухер


 
Сергей М. ©   (2008-10-31 08:42) [15]


> и поймаешь уведомление об ошибке


Чтой-то вдруг ?

В очередной итерации я схлопотал исключение, тут же поймал его, проанализировал (если таковое возможно - а почему бы и нет ?) его причину и возможные последствия и тут же принял решение: выходить ли из цикла, возобновить ли цикл или рерайзить

Первый вариант ведет к корректному (штатному) завершению сервиса, третий - к аварийному ("падение"), второй - продолжение нормальной работы..


 
Slym ©   (2008-10-31 11:44) [16]

Сергей М. ©   (31.10.08 8:42) [15]
если вся работа идет внутри цикла и нет вызовов прочих процедур в которых захватываются ресурсы - то да
а если происходят операции по захвату ресурсов: открытие файлов, подключения к дб, прочие захваты "власти"... то без должной защиты  получишь только уведомление об ошибке - выполнение освобождающего ресурсы кода прервалось - сушите весла


 
Сергей М. ©   (2008-10-31 11:53) [17]


> Slym ©   (31.10.08 11:44) [16]


> без должной защиты  получишь только уведомление об ошибке
> - выполнение освобождающего ресурсы кода прервалось - сушите
> весла
>


Ну это еще надо постараться, чтобы таким веслом огрести)

То что в действительно критичных к жизнеспособности сервиса точках алгоритма должны быть расставлены местные индивидуальные ловушки исключений - это бесспорно. Но и расставлять их на каждом шагу и по каждому чиху тоже вряд ли оправдано.


 
Anatoly Podgoretsky ©   (2008-10-31 12:19) [18]


> Но и расставлять их на каждом шагу и по каждому чиху тоже
> вряд ли оправдано.

Зависит от сервиса, возможно еще и более жестко, если сервис должен выживать при любых ситуациях, кроме отсутствие критически важно внешнего ресурса, да и это тоже должен выдерживать.



Страницы: 1 вся ветка

Текущий архив: 2008.12.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
15-1222862652
vajo
2008-10-01 16:04
2008.12.07
Как отключить кнопки тачпада ноутбука?


2-1225438987
zxc
2008-10-31 10:43
2008.12.07
Clipboard


2-1225277295
garik_
2008-10-29 13:48
2008.12.07
Наследование


9-1175779923
ElectriC
2007-04-05 17:32
2008.12.07
Запрет нажатия системных клавиш


15-1223069414
Германн
2008-10-04 01:30
2008.12.07
Чёрт знает что печатается на принтере