【问题标题】:Which errors should I handle? Which ones are "fatal"?我应该处理哪些错误?哪些是“致命的”?
【发布时间】: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


【解决方案1】:

“关键”取决于您对文件执行的操作。

任何错误代码都可能是由于程序员错误或正在运行的机器上的某些异常情况造成的;我不认为这是错误处理的重要区别。

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

请注意,访问冲突不是 GetLastError() 知道的事情,所以我不明白它与您的问题的相关性。

【讨论】:

  • 实际上,我收到了来自GetLastError 的访问违规。当然不是CreateFile,而是来自其他功能(不幸的是,我不记得哪些功能了)。但无论如何,好点,+1。
  • “从 getlasterror 获取访问冲突”是什么意思?
  • 这意味着我收到了从 GetLastError 返回的ERROR_NOACCESS,但我不记得我得到它是为了什么功能。
【解决方案2】:

我认为这真的取决于上下文,不可能普遍决定,而是需要根据具体情况决定。

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

【讨论】:

    猜你喜欢
    • 2012-04-16
    • 2010-11-03
    • 1970-01-01
    • 2013-11-04
    • 2017-02-09
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2010-11-26
    相关资源
    最近更新 更多