确定错误的原始原因

dbr*_*nk0 2 c error-handling

在C中是否有一些众所周知的嵌套错误处理模式/实践,比如Java中的嵌套异常?

使用通常的"只返回错误代码/成功"错误细节可能会丢失,然后程序才能确定它应该记录/报告错误.

想象一下类似于此的代码:

err B()
{
  if (read(a/b/c/U.user) != OK) {
    return read_error; //which would be eaccess or we could return even e_cannot_read_user
  }

  if (is_empty(read_user.name)) {
    // we could tell exactly what is missing here
    return einval;
  }
  ...
}

err A()
{
  if (B() != OK) {
    if (cannot_handle_B_failing()) {
      return e_could_not_do_b;
    }
  }
  ...
}

main()
{
  ...
  if (A() != OK) && (no_alternative_solution()) {
    report error_returned_by_A;
    wait_for_more_user_input();
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有人在C中成功尝试某种嵌套错误代码/消息?可以报​​告(主要)用户名丢失或由于权限无效而无法读取文件F的事实.

有没有图书馆来支持这样的事情?

Vah*_*yan 6

我建议你看看Apple的错误处理指南.它是为Objective-C而设计的,也是主要的课程NSError.他们使用userInfo字典(map)来保存有关错误的详细信息,并且如果需要,他们有预定义的NSUnderlyingErrorKey常量来保存NSError该字典中的底层对象.

因此,您可以struct为代码声明自己的错误并实现类似的解决方案.

例如

typedef struct {
  int code;
  struct Error *underlyingError;
  char domain[0];
} Error;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用domain字段对错误进行分类(根据需要通过库,文件或函数); code确定错误本身的underlyingError字段和可选字段,以找出导致错误的基础错误.