重置GetLastError值

3

Delphi Xe.

在 Delphi 帮助文档中:“...调用此函数通常会重置操作系统错误状态...”

如何将当前错误重置为 0?即让 GetLastError=0。

示例:

Try
// There is an error
except
showmessage(inttostr(getlasterror)); // Ok, getlasterror<>0
end;
....
// no errors
....
// How to reset a current error on 0?
showmessage(inttostr(getlasterror)); // Again will be <> 0
3个回答

7

在实际出现错误时,你应该只调用GetLastError方法。一些Windows API函数会在成功时将错误重置为0,而另一些则不会。无论哪种情况,你都应该只在需要了解最新错误时才查询错误状态。

请注意,还有一个SetLastError方法,但这并没有什么帮助;如果你将最后的错误设置为0,那么GetLastError当然会返回0。


调用GetLastError没有实际限制。GetLastError是确定性函数。 - Premature Optimization
1
@Downvoter 或许我表达不够清晰,但我并没有说GetLastError有什么神奇的功能。我的意思是a) 一些函数会在成功时重置错误,而另一些则不会(这是100%正确的,实际上您也提到了这一点),b) 除非函数报告了错误,否则没有理由想要询问最后一个错误。该方法的重点不是要问“是否发生了错误?”,而是要问“为什么我的上一个API调用返回了一个错误?”鉴于OP的问题,我认为这些都是有效和相关的观点。 - dlev
@Downvoter,重点是除非你已经被告知有错误,否则不应该打扰调用GetLastError。不要使用它来检测是否有错误。也就是说,Gu的预期用例是有缺陷的。即使实际上没有任何错误,也不能保证GetLastError会返回0。 - Rob Kennedy
@dlev,@Rob Kennedy,我不同意,因为被调用方设置了扩展错误信息并返回基本错误信息,调用方可能只会坚持使用扩展错误检查(这可能会提高代码的可读性)。要说服我改变看法,被调用方必须返回TRUE,但不得事先使用SetLastError(ERROR_SUCCESS)。 - Premature Optimization
1
@Downvoter,GetLastError的文档很清楚:“大多数设置线程最后错误代码的函数在失败时进行设置。但是,有些函数在成功时也设置了最后的错误代码。如果该函数未记录设置最后错误代码,则此函数返回的值仅是最近设置的最后错误代码。一些函数在成功时将最后错误代码设置为0,而其他函数则不会。”除非一个函数被记录为在成功时设置代码,否则你不应该假定它可以用于检测错误。 - Rob Kennedy
显示剩余2条评论

5

1
这是一个低质量文档的例子。WinAPI函数GetLastError会保留其返回值,直到下一次调用SetLastError,因此重复调用将没有任何效果。
SetLastError(42);
for I := 1 to 100 do
  Assert(GetLastError() = 42); // all of those assertions evaluates to True

此外,在 Delphi 文档中,GetLastError 被错误地放置在异常处理例程中;这也是错误的,这些错误处理机制彼此无关。
关于参考文献中的那个愚蠢的“通常”单词:这是因为用于输出 GetLastError 返回值的函数调用了 SetLastError。例如:
  SetLastError(42);
  OutputDebugString(PChar(Format('GetLastError() = %d', [GetLastError()]))); // 42
  OutputDebugString(PChar(Format('GetLastError() = %d', [GetLastError()]))); // 0! (ERROR_SUCCESS set by the previous OutputDebugString call)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接