Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
15-1222946328
Буум
2008-10-02 15:18
2008.12.07
Открытие методов класса внутри другого класса


6-1196066866
tytus
2007-11-26 11:47
2008.12.07
как заставить Indy 10 передавать тело письма по русски ?


15-1223089379
TUser
2008-10-04 07:02
2008.12.07
Что такое компьютер?


1-1202915605
Zabludshiy
2008-02-13 18:13
2008.12.07
Проблема с заполнением treeView.Items[i].Data


15-1222953108
turbouser
2008-10-02 17:11
2008.12.07
Что бы такого изобрести?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский