Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Try except停止服务执行_Delphi_Try Catch_Indy - Fatal编程技术网

Delphi Try except停止服务执行

Delphi Try except停止服务执行,delphi,try-catch,indy,Delphi,Try Catch,Indy,因此,下面的代码可以工作,但一旦发送电子邮件出现问题并引发异常,服务就会停止。我有没有办法让它继续下去,穿过所有的队列?即使有错误的消息。例如,停止我的服务的错误是“我附加”一个不存在的文件。您说您已经确认进入了finally部分。因此有3种可能性: finally部分中的一行代码阻止代码继续 另一个异常在finally部分中提出 当您进入finally部分时,您已经处于“异常状态”。因此,离开finally将带您进入调用堆栈中的下一个finally/except部分 您必须添加调试日志来确认这

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

您说您已经确认进入了finally部分。因此有3种可能性:

  • finally部分中的一行代码阻止代码继续

  • 另一个异常在finally部分中提出

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

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

    • 您的
      邮件
      实例无效,您的吞咽器发现访问冲突。当您再次尝试使用
      Mail
      中的except部分时,您会遇到另一个访问冲突

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

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


    你为什么要接受所有异常?@DavidHeffernan不确定你的意思……因为我的一些邮件在发送时可能会出现问题,我正在尝试不锁定某些邮件的发送,因为1或2无法发送。你为什么要捕获所有异常?你是对的,我已经在中注释了所有内容,除了日志消息,最后是日志消息,服务没有停止。非常感谢。我想我可以从这里解决它。
      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)