2015-07-21 74 views
1
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

@DavidHeffernan不确定你的意思。 – CiucaS

+0

https://en.m.wikipedia.org/wiki/Error_hiding –

回答

2

你说你已经确认你进入最后部分。因此,有3种可能性:

  1. 的代码在最后部分块A线从持续的代码。

  2. 另一个例外是在最后一节中提出的。

  3. 当您最后进入部分时,您已处于“异常状态”。所以最后最后带你到下一个最后/除了在调用堆栈的部分。

你必须添加调试日志记录以确认哪些,但我怀疑数量3.可能的触发条件为现有的异常状态:

  • Mail情况下是无效的,和你的吞发现访问违规。当您再次尝试在中使用Mail时,除部分外,您会收到另一个访问冲突。

  • MarkMailExecution内的某些东西会触发它自己的异常。

  • (我假设你的记录机制是不是失败,因为你已经越来越从它的一些信息。)

+0

你说得对,除了日志消息之外,我已经评论了除了最后的所有内容之外,并且服务不停止。谢谢!我想我可以从这里解决它。 – CiucaS