2013-07-02 4 views
1

как я могу убедиться, что служба никогда не будет прекращена по какой-либо причине
за исключением случаев, когда она остановлена ​​пользователем.
Я пробовал это, но не получилось.безостановочное обслуживание для любого исключения

OnExecute:

Count := 0; 
while not Terminated do 
begin 
    Inc(Count); 
    While Count >= SecBetweenRuns do 
    Begin 
    Try 
     Count := 0; 
     ... 
    Except 
     on E: exception do 
     Begin 
     JFCLogFile1.LogText := E.Message; 
     Break; 
     End; 
    End; 
    End; 
    Sleep(1000); 
    ServiceThread.ProcessRequests(False); 
end; 

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

+0

Что не так с кодом, который вы указали? Как это не соответствует вашим требованиям? –

+0

@RemyLebeau Был изменен вопрос –

+0

Вы уже знаете ответ - используйте блок try/except. Так в чем же проблема? По крайней мере, вам нужно переместить вызов 'ServiceThread.ProcessRequests()' в блок 'try'. –

ответ

3

Единственный способ, который может произойти, заключается в том, что возникает исключение, которое не было обнаружено, и разрешено покидать обработчик OnExecute. Таким образом, вы, очевидно, не поймаете все, что считаете себя.

Лично я предлагаю не использовать событие OnExecute вообще. Переместите вашу логику в отдельный рабочий поток, который запускается в событии OnStart и завершен в событии OnStop. По крайней мере, так, если поток выйдет из строя, он не остановит службу. Вы можете переопределить метод TThread.DoTerminate(), чтобы проверить свойство TThread.FatalException, чтобы узнать, не уничтожил ли это нечеткое исключение поток.