【问题标题】:A function returning "ENOTDIR", "EBUSY", etc. as strings?将“ENOTDIR”、“EBUSY”等作为字符串返回的函数?
【发布时间】:2017-01-21 16:22:59
【问题描述】:

strerror() 函数返回一个简短的错误描述,给定错误号作为参数。例如,如果参数为 ENOTDIR,则返回“Not a directory”,如果参数为 EBUSY,则返回“设备或资源忙”等。

但是,有没有一个函数可以返回“ENOTDIR”来表示参数等于 ENOTDIR,“EBUSY”表示参数 EBUSY 等等?

我只是想避免为此编写一个巨大的 switch 语句。

【问题讨论】:

  • errno 返回最后一个错误号。这并不完全符合您的要求,但您始终可以创建一个枚举并稍后将其转换为字符串,there are a couple ways to do that
  • 这听起来是个坏主意。 strerror() perror() 等函数专门用于提供有用的错误消息。为什么选择打印枚举名称而不是相关的错误消息?
  • @David 我正在编写程序员使用的工具,希望打印“EFAULT”、“EBUSY”、“ENOTSOCK”等,而不是一些文本。程序员说这对他们更有用。我不会与程序员争论这一点,尤其是如果我是程序员的话。 ;)
  • 为什么要使用 switch 语句?我会为此使用一个字符串数组。
  • @Peter 有多大?在 Linux 上,大约有 130-140 个已定义的 errno 值。

标签: c error-handling runtime-error


【解决方案1】:

没有 - 没有提供此功能的标准或常用的非标准函数。

一种方法是编写一个巨大的 switch 语句,但这可能不是您采用的最佳方法。 errno 的大多数值都没有由任何标准指定,因此它们的值在不同操作系统甚至同一操作系统的不同版本之间可能一致,也可能不一致。

另外,后端会很痛苦。

如果可以接受一些运行时开销,一种更优雅的方法是编写一个函数,在这些错误代码发生时查找它们,而不是将这些值硬编码到一个大表中。 GNU/Linux 系统有一个所有可能的errno 值列表:

/usr/include/asm-generic/errno-base.h
/usr/include/asm-generic/errno.h

这些文件提供了每个errno 值的#define 及其值,并在相邻注释中提供了简短描述。逐行搜索这些文件并打印出匹配的错误代码非常简单。即使没有,这些文件也是您编写大型 switch 语句的开始。

请注意,内核可能会在将这些值传递给用户空间时否定这些值。

【讨论】:

    【解决方案2】:

    正如 David 上面指出的那样,问题在于没有可以提供所需功能的标准函数。所以认为这将是一个尝试编写脚本的好问题,我写了一些东西来自动生成开关功能(如果有必要的话)并发布代码here。似乎在 OS X 上工作正常,否则里程可能会有所不同。可以将这样的脚本添加到构建过程中,以确保正确定义了值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2020-07-17
      • 2018-03-14
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多