Try except 停止服务执行
Try except stops the service execution
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)
所以下面的代码可以工作,但是一旦发送电子邮件出现问题并引发异常,服务就会停止。我有什么办法可以让它继续并通过所有队列吗?即使有错误的消息。例如,停止我的服务的错误是 "I attach" 一个不存在的文件。
您说您已确认进入 finally 部分。所以有3种可能:
finally 部分中的一行代码阻止代码继续。
在 finally 部分引发了另一个异常。
当您进入 finally 部分时,您已经进入 "exception state"。所以离开 finally 会将您带到调用堆栈中的下一个 finally/except 部分。
您必须添加调试日志记录来确认,但我怀疑是第 3 个。现有异常状态的可能触发器:
您的 Mail
实例无效,您的 swallower 发现了访问冲突。当您再次尝试在 except 部分中使用 Mail
时,您会遇到另一个访问冲突。
MarkMailExecution
中的某些内容触发了它自己的异常。
(我假设您的日志记录机制没有失败,因为您已经从中获取了一些信息。)
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)
所以下面的代码可以工作,但是一旦发送电子邮件出现问题并引发异常,服务就会停止。我有什么办法可以让它继续并通过所有队列吗?即使有错误的消息。例如,停止我的服务的错误是 "I attach" 一个不存在的文件。
您说您已确认进入 finally 部分。所以有3种可能:
finally 部分中的一行代码阻止代码继续。
在 finally 部分引发了另一个异常。
当您进入 finally 部分时,您已经进入 "exception state"。所以离开 finally 会将您带到调用堆栈中的下一个 finally/except 部分。
您必须添加调试日志记录来确认,但我怀疑是第 3 个。现有异常状态的可能触发器:
您的
Mail
实例无效,您的 swallower 发现了访问冲突。当您再次尝试在 except 部分中使用Mail
时,您会遇到另一个访问冲突。MarkMailExecution
中的某些内容触发了它自己的异常。(我假设您的日志记录机制没有失败,因为您已经从中获取了一些信息。)