【问题标题】:What is "complete error trapping"?什么是“完全错误捕获”?
【发布时间】:2013-11-08 18:57:13
【问题描述】:

仅使用低级 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);
}

【问题讨论】:

  • ANYTHING 会抛出异常导致程序崩溃吗?如果你已经设法让这个答案不,那么这对我来说听起来像是完全错误陷阱。
  • 也许你应该问问你的教授他的意思。
  • 不管我的 cmets 是什么,我都不是给你的作业评分的人,@AShelly 有一个完全正确的观点。
  • 我认为在这种情况下“完全错误捕获”意味着“编写正常代码,而不是废话”(这意味着检查每个可能失败的系统调用的返回值)。

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


【解决方案1】:

您不应关闭未能打开的文件描述符。

除此之外,是的,您已经对open() 调用进行了充分的错误检查。现在重复其他open() 调用、read() 调用和write() 调用,并且可能是作为主线处理一部分的close() 调用——错误路径中的close() 调用是尽力而为,不需要以相同的方式进行错误检查。

不过,您的错误报告并不是很有帮助。您说“file1”,但这不是文件的名称。使用perror() 也无济于事。我从不使用它,因为它没有让我对消息格式有足够的控制权。您正在将文件名作为字符串传递;这比人们经常做的要好得多,但你也不能表达程序尝试的哪个操作失败了。我会将fprintf(stderr, ...)errnostrerror() 结合使用。注意不要通过调用本身设置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() 声明不需要&lt;stdarg.h&gt; 标头; test() 的实现确实需要标头。

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 2016-02-27
    • 2017-08-08
    • 2010-10-21
    • 2013-08-29
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多