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

Gus*_*sky 4 c c++ error-handling

查看stackoverflow或其他地方的代码,似乎我很少看到perror()用于报告错误的确切性质.printf更常见.这是一个指示perror有什么错误或缺失的指标吗?我希望它能更频繁地使用,因为它可以提供更好的信息.

Mat*_*son 7

我个人更喜欢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);
}
Run Code Online (Sandbox Code Playgroud)

这样,我们也知道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); 

... 
Run Code Online (Sandbox Code Playgroud)

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