похоже, что попытка / исключение не захватывает исключения - Delphi Service Application - PullRequest
4 голосов
/ 05 июля 2010

У меня есть служба, написанная на Delphi 2007, в которой я пытаюсь перехватить любые неизвестные исключения. Присвоение метода исключению on, похоже, не работает («Forms.Application.OnException: = UnknownApplicationException»). «UnknownApplicationException» не вызывается - я связываю это с тем фактом, что в приложении нет формы, поэтому метод никогда не будет назначен. Помимо этого, я также попытался создать исключение для таймера (после комментирования «Forms.Application.OnException: = UnknownApplicationException», чтобы оно не мешало). Таймер срабатывает через 60 секунд после запуска службы:

procedure TProcessScheduler.Timer1Timer(Sender: TObject);    
begin    
  try    
    Raise Exception.Create('THIS GIG SUCKS');    
  except     
    LogEvent(Name,rsUNKNOWN_EXCEPTION,EVENTLOG_AUDIT_FAILURE,0);    
    ExitCode:=-1;    
    Halt;    
  end;     
end;

Исключение, похоже, никогда не фиксируется - служба запускается, и через 60 секунд, когда срабатывает этот таймер, я слышу звук ошибки Windows, но не вижу диалогового окна ошибки - возможно, это может быть связано с тем, что приложение такое сервис? 'Halt' никогда не вызывается, и приложение продолжает работать (я предполагаю, что оно ждет, пока кто-нибудь нажмет ok в диалоговом окне невидимой ошибки, которое оно создало). Любые идеи, почему код под «кроме» не вызывается? Заранее спасибо! КП

Ответы [ 4 ]

6 голосов
/ 05 июля 2010

Переназначение Forms.Application.OnException - плохая идея, так как TServiceApplication.Run() делает это сам.Вы либо сделаете это раньше, тогда ваше назначение не будет иметь эффекта, либо вы сделаете это позже, и в этом случае вы удалите механизм обработки исключений, который был введен в действие.

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

2 голосов
/ 05 июля 2010

Пара заметок:

  • Поскольку вы вызываете исключение в блоке try-Кроме, оно не должно запускать какой-либо обработчик Application.OnException, просто потому, что исключение не обрабатывается.

  • Как вы определили, что Остановка не вызывается? Записывается ли исключение в LogEvent?

  • В приложении-службе ExitCode и Halt не функционируют так, как вы ожидаете их в обычном приложении Windows. Служба не останавливается с помощью вызова halt, она должна быть остановлена ​​с помощью диспетчера управления службами Windows.

  • Если исключающая часть вашего блока try-exc действительно не достигнута, это означает, что Windows отключилась, потому что произошло что-то, что ее не устраивает. Это может быть что-то в методе LogEvent, который вы вызываете. Если отображается диалоговое окно или также возникает исключение, ExitCode и Halt не будут достигнуты.

  • С сервисом обычно не связан рабочий стол, поэтому показ диалогов не будет работать.

  • Если вам нужен сервис для показа диалогов (плохая идея, кстати, сервисы предназначены для работы без взаимодействия с пользователем), вам нужно сделать его интерактивным и запустить его под другой учетной записью пользователя, чем в обычной "системе "учетная запись, под которой работают службы. Вы делаете это через менеджера сервисов.

1 голос
/ 05 июля 2010

Почему вы устанавливаете Forms.Application ? AFAIK сервис использует переменную Application, объявленную в SvcMgr, которая объявлена ​​как:

var
  Application: TServiceApplication = nil;

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

0 голосов
/ 22 июня 2011

Я создаю свою собственную версию файла SvcMgr.pas, чтобы исключить привязку на месте к глобальному обработчику исключений Application, чтобы я мог создать свою собственную. Я делаю это потому, что 1) я не смог найти другого простого способа сделать это, и 2) так как это устройство является автономным устройством, которое включено только в службы Windows, тогда влияние на другие устройства минимально. Вы можете скачать код с моего сайта, чтобы увидеть, как это работает.

...