我应该处理哪些错误?哪些是“致命的”?

时间:2011-11-01 10:12:44

标签: c windows winapi error-handling error-code

某些Windows函数(例如CreateFile)在调用GetLastError时可能会返回巨大的错误代码,并且检查每个可能的错误代码是不切实际的 - 那里通常没有足够的文档,并且经常添加新的错误代码。

其中一些(例如访问冲突或无效参数)是由程序员错误引起的,不应允许继续执行程序。但是,其他因素是由于其他因素造成的,例如错误的文件权限,共享冲突,错误的文件名等,开发人员很少或根本无法控制。

我想处理所有“非关键”错误(例如错误的文件名),同时允许“严重错误”(例如访问冲突)导致程序崩溃。

理想情况下,我会说:

// ... an error occurred. Is it a programmer error?

if (IsErrorCritical(GetLastError()))
{
    // Yes; raise an exception, crashing the program.
    RaiseException(GetLastError(), 0, 0, NULL);
}

如何确定哪些错误代码可以安全地抑制(例如,在枚举磁盘上的文件时),何时无法预测每一个结果?

2 个答案:

答案 0 :(得分:4)

“严重”取决于您对文件的处理方式。

任何错误代码都可能是由于程序员错误或正在运行的计算机上的一些特殊情况;我不认为这是错误处理中的一个重要区别。

对于您没有专门处理的错误(“未知”错误),只假设文件未创建,并处理该情况。为什么没有创建它并不重要,只是假设它不是并且考虑到那种情况。根据您的代码正在做什么以及您希望在此方案中投入多少精力,这可能是致命的。

请注意,访问权限违规行为不是GetLastError()知道的内容,因此我不了解其与您的问题的相关性。

答案 1 :(得分:3)

我认为这实际上取决于具体情况,因此不可能一般地决定这一点,而是需要根据具体情况来决定。

我说这个的原因是有时相同的错误代码出现在不同的上下文中,所以它不是错误代码本身,可用于确定它是否是关键的,而是上下文本身。