2015-07-21 78 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