什么是“完全错误捕获”?

时间:2013-10-29 14:40:13

标签: c error-handling low-level low-level-code low-level-io

  

仅使用低级I / O在C中编写程序。

     

程序必须具有完整的错误捕获。特别是   程序应该使用perror()来报告系统错误...

在我的计划中......

test("checked argument count");


if((input_file1 = open(argv[1], O_RDONLY)) < 0)
{
    test("couldn't open file1");
    perror(argv[1]);
    close(input_file1);
    exit(1);
}
test("opened file1");

如果我为每次读/写尝试实现这样的代码,这会被视为“完全错误捕获”吗?

注意test()仅用于调试,稍后会被删除:

void test(const char * message)
{
    printf("\ttesting: %s \n", message);
}

1 个答案:

答案 0 :(得分:1)

您不应该关闭无法打开的文件描述符。

除此之外,是的,您已对open()电话进行了足够的错误检查。现在重复其他open()来电,read()来电和write()来电,以及可能属于主线处理的close()来电 - { {1}}错误路径中的调用是最大的努力,不需要以相同的方式进行错误检查。

但是,您的错误报告不是很有帮助。你说'file1',但这不是文件的名称。使用close()也不会有太大帮助;我从不使用它,因为它没有给我足够的控制消息格式。您 将文件名作为字符串传递;这比人们经常做的要好得多,但是你也不能表达程序尝试失败的操作。我将perror()fprintf(stderr, ...)errno结合使用。注意不要通过调用自己设置strerror()的函数(errno函数是否安全?)来破坏errno。如果您不确定,请捕获test()并(如有必要)将其重置为捕获的值:

errno

修订后的int errnum = errno; test("couldn't open file", argv[1]); errno = errnum; perror(argv[1]); exit(1); 功能可能是:

test()

这是它的核心;您需要调整它以使用#include <stdarg.h> extern void test(char const *fmt, ...); void test(char const *fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); putc('\n', stderr); } 函数的当前内部。带有省略号的test()声明不需要test()标题; <stdarg.h>的实现确实需要标题。