尝试除停止服务执行

时间:2015-07-21 09:35:22

标签: delphi try-catch indy

  List := FQueue.LockList;
  for I := 0 to List.Count - 1 do
  begin
    Mail := TIdMessageTaskman(List[I]);
    FEventLogger.LogMessage(  'Mail' + Mail.ToString, EVENTLOG_INFORMATION_TYPE , 0, 2);
    try
      try
        FidSmtp.Connect();
        FidSmtp.Send(Mail);
      except
        on e: exception do
        begin
          FEventLogger.LogMessage('Error sending mail  ' + e.ClassName + ', ' +
            e.Message, EVENTLOG_ERROR_TYPE, 0, 2);
          MarkMailExecution(Mail.TaskID, Mail.NotificationID, False, e.Message);
          Continue;
        end;
      end;
    finally
      begin
      if FidSmtp.Connected then
      FidSmtp.Disconnect;          
      end;
    end;
    FEventLogger.LogMessage(  'after finally', EVENTLOG_INFORMATION_TYPE , 0, 2);
    MarkMailExecution(Mail.TaskID, Mail.NotificationID, True, '');
    FreeAndNil(Mail)

因此,以下代码可以正常工作,但只要发送电子邮件出现问题并引发异常,服务就会停止。我有没有办法让它继续并通过所有队列?即使有错误的消息。例如,当“我附加”不存在的文件时,停止我的服务的错误。

1 个答案:

答案 0 :(得分:2)

你说你已经确认你进入了最终部分。所以有三种可能性:

  1. finally 部分中的一行代码会阻止代码继续。

  2. finally 部分提出了另一个例外。

  3. 当您进入最终部分时,您已处于“异常状态”。所以离开终于会带你到调用堆栈中的下一个finally / except部分。

  4. 您必须添加调试日志以确认哪个,但我怀疑是第3个。现有异常状态的可能触发器:

    • 您的Mail实例无效,并且您的吞服者遇到了访问冲突。当您再次尝试在部分中使用Mail时,您会收到另一次访问冲突。

    • MarkMailExecution内的某些内容触发了自己的例外。

    • (我假设您的日志记录机制没有失败,因为您从中获取了一些信息。)