【发布时间】:2011-12-19 09:11:22
【问题描述】:
CreateFile 等一些 Windows 函数在调用 GetLastError 时可能会返回大量种错误代码,并且检查每个可能的错误代码是不切实际的——通常没有足够的错误代码文档,并且经常添加新的错误代码。
其中一些(例如访问冲突或无效参数)是由于程序员错误导致的,不应允许程序继续执行。但是,还有一些是由于其他因素造成的,例如文件权限错误、共享违规、文件名错误等,开发人员几乎无法控制。
我想处理所有“非关键”错误(例如错误的文件名),同时允许“关键错误”(例如访问冲突)使我的程序崩溃。
理想情况下,我会说:
// ... an error occurred. Is it a programmer error?
if (IsErrorCritical(GetLastError()))
{
// Yes; raise an exception, crashing the program.
RaiseException(GetLastError(), 0, 0, NULL);
}
当我无法预测每个结果时,如何确定可以安全地抑制哪些错误代码(例如,枚举磁盘上的文件时)?
【问题讨论】:
-
我认为程序不应该崩溃,除非在真正的特殊情况下(访问冲突等)。未能创建文件应该是预期的失败,并以优雅的方式处理。此外,一旦添加了一些新的错误代码,您的 IsErrorCritical() 函数就会过时。
-
对,但我怎么知道某件事是否“真正与众不同”?这就是问题..
-
当我说异常时,我就是这个意思。访问冲突和内存不足是两大问题;可能还有其他人,但你明白了。如果 CreateFile() 失败导致您的程序崩溃,那么您做错了恕我直言。
-
@Luke:你是建议我将错误代码列入白名单,还是将其列入黑名单?
-
我只会在 exceptions (例如 Windows 结构化异常,如访问冲突、堆栈溢出等)、内存不足的情况下崩溃,这种性质的事情。我不会尝试围绕特定的 GetLastError() 代码来概括这一点。
标签: c windows winapi error-handling error-code