【问题标题】:Try except stops the service execution尝试 except 停止服务执行
【发布时间】:2015-07-21 09:35:21
【问题描述】:
  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)

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

【问题讨论】:

  • 你为什么要吞下所有的异常?
  • @DavidHeffernan 不确定你的意思..
  • 因为我的一些邮件在发送时有可能出现问题,我正在尝试不锁定一些邮件的发送,因为无法发送1或2。
  • 为什么要捕获所有个异常?

标签: delphi try-catch indy


【解决方案1】:

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

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

  2. finally 部分引发了另一个异常。

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

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

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

  • MarkMailExecution 中的某些内容会触发其自身的异常。

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

【讨论】:

  • 你是对的,我已经评论了除了日志消息之外的所有内容,并且服务不会停止。谢谢!我想我可以从这里解决它。
猜你喜欢
  • 2022-01-12
  • 2021-03-02
  • 2011-04-05
  • 2020-04-02
  • 2011-05-03
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多