Gus*_*sky 4 c c++ error-handling
查看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);
}
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",作为一个例子[一般来说这是非常糟糕的编程,但也许有一个合理的理由...]