“文件损坏”错误?

时间:2018-07-28 08:39:07

标签: c posix errno

是否有常规的errno代码指示指定的文件已损坏(它不符合应该的文件格式)?

我正在编写文件解析器,不知道最适合返回的代码是什么。总有EINVAL,尽管我希望能提供比这更具体的东西,因为它也可以用于其他任何无效参数,尤其是在我的情况下,调用者知道调用失败是很有价值的,因为该文件已损坏。

EBADFEDOMEILSEQEIOENOSTREPROTO是我所看到的想象是用来表示这种意思的,但是这种情况有约定吗?

5 个答案:

答案 0 :(得分:0)

我的偏爱是EBADMSG,然后是EPROTO,最后是EINVAL,作为最后的通用手段。

一些相关的讨论在这里:https://github.com/billziss-gh/winfsp/issues/156

答案 1 :(得分:0)

  

errno代码,指示指定的文件[...]不符合应为的文件格式

EFTYPE呢?

挑剔的人可能会认为这段代码是针对“相反”情况的:

来自the related POSIX specs

  

此错误代码在较早的建议中提出为“文件类型的不适当操作”,这意味着请求的操作不适用于函数调用中指定的文件。

但是很好...

答案 2 :(得分:0)

在库代码中设置errno可能不是一个好主意,除非您可以保证所调用的OS函数不能将errno设置为相同的值。否则,您将无法区分库中的错误或库所调用的OS函数中的错误。

我更愿意为我的库定义我自己的错误代码集,并保留一个错误代码来表示OS错误。像这样:

enum mylib_err
{
   MYLIB_ERR_NO_ERROR = 0,
   MYLIB_ERR_ERRNO, /* Check errno for further info */
   MYLIB_ERR_PARSE_ERROR,
   MYLIB_ERR_PLANETS_WRONGLY_ALIGNED,
   ... etc..
};

...

enum mylib_err err = mylib_parse_file(....);
if (err)
{
   if (err == MYLIB_ERR_ERRNO)
     error(EXIT_FAILUER, errno, "xxxx");
   else
     .. some other error handling
}

答案 3 :(得分:0)

好吧,POSIX(及其之前的UNIX)没有为文件加上任何格式,因此很难用信号表示格式失败。文件只是一个字节序列,其中任何字节都可以跟在文件中的前一个字节之后。无需在读取时指定记录边界或大小,那么如何识别文件格式不符合?

Errno值用于标识系统错误(发出系统调用时由于系统某些状况而产生的错误),因此对于错误的格式,没有ESOMETHING常量。

顺便说一句,符合errno变量值的数字列表是系统特定的,并且可能随内核/ stdlib的版本而变化...因此,您不能选择数字和确保您选择的号码在将来的版本中不会被系统使用。

因此,使用errno返回错误代码是一种不好的做法。许多库遵循与stdlib相同的模式,但是带有前缀something_errno变量。这是我对你的推荐。

无论如何,解析器通常会返回返回一个解析树(语法树),并且您仍然可以使用节点字段来指示解析错误。请勿使用系统错误来污染系统错误的含义,而应将其设计用于什么目的。

答案 4 :(得分:-1)

以我个人的观点,您不应依赖于返回系统错误代码之一,而应进行适当的诊断,并通过易于理解的解释来解释您所面临的问题以及软件用户可以修复的方式。 / p>

已经是2018年了,我们可以抛出异常并返回字符串,而不是8位整数。

以下是当代"MISRA C++:2008 Guidelines for the use of the C++ language in critical systems",请阅读并使用它们。 禁止(请参阅规则19-3-1)。