c – 有没有理由在错误处理代码中没有广泛地看到perror?

查看stackoverflow或其他地方的代码,似乎我很少看到perror()用于报告错误的确切性质. printf更常见.这是一个指示perror有什么错误或缺失的指标吗?我希望它能更频繁地使用,因为它可以提供更好的信息.
最佳答案
我个人更喜欢strerror(),它大致相同,但允许你将错误信息与printf或类似的函数一起使用,为程序的编码人员或用户提供更多有用的功能,具体取决于错误的类型.

例如:

errno = 0;
FILE *f = fopen(argv[1], "rb");
if (!f)
{
    fprintf(stderr, "File %s open failed: error code %d ('%s')\n", 
            argv[1], errno, strerror(errno));
    exit(1);
}

这样,我们也知道WHICH文件(说它是一个复制文件的程序,perror不一定会告诉你它是“源”还是“destionation”).

如果错误是编程错误[或“预计不会出错的东西”],你也可以这样做:

#define UNEXPECTED(cond) do { if (cond) { do_unexpected(errno, #cond, __FILE__, __LINE__); } while(0)

void do_unexpected(int err, const char* cond, const char *file, int line)
{
    fprintf(stderr, "Unexpected error %s [errno=%d, errstr=%s] at %s:%d", 
            cond, err, strerror(errno), file, line);
    exit(1);
}

errno = 0;
FILE *config = fopen("config.txt", "r");

UNEXPECTED(!config); 

... 

这是假设你不希望删除“config.txt”,作为一个例子[一般来说这是非常糟糕的编程,但也许有一个合理的理由…]

转载注明原文:c – 有没有理由在错误处理代码中没有广泛地看到perror? - 代码日志