文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
错误处理
0x0B-C语言错误处理
三个必要的头文件
#include <stdio.h> #include <errno.h> #include <string.h>
一个声明
extern int errno;
四个重要函数
int ferror(FILE* stream); int feof(FILE* stream); char *strerror(int errnum); void perror(const char *s);
以上是在错误处理中常用的操作,前两者是必要包含的,最后的函数则是酌情使用
ferror
:- 检查流中是否有错误,如果有则返回一个非
0
值,如果没有错误则返回0
- 检查流中是否有错误,如果有则返回一个非
feof
:用于检查是否到了文件尾,经常用于文件的读取工作,读取到文件尾则返回非零值
input = fopen("file.in", "r"); while(!feof(input)) { fscanf(input, "%s", str); ... 等同于 do{ rtn_value = fscanf(input, "%s", str); ... }while(rtn_value != EOF);
strerror
:当某个函数或者操作触发了设置
errno
变量的时候,我们可以立即使用该函数进行显示输出strerror(errno); 输出: Too many open files
perror
:与上方的函数相同,也是用来输出错误的,只不过它自动使用
errno
变量,并且在自前方添加所传入的参数以及一个冒号perror("Now"); 输出: Now: Too many open files
同样的,对于自己的错误处理,可以设计一个小体系来满足自我需求
通过返回值
/* fun.h */ void fun_error(size_t errnum); size_t test_fun(int arg);
在此我们可以让外界接触不到真实的包含有错误的数组或其他数据结构,而是将其放于
.c
文件中隐藏起来,通过一个函数来进行访问。隐藏错误实现
/* fun.c */ static const char * fun_err[] = { "Computing nagative!", "Invalid argument", "Bad result" }; size_t test_fun(int arg) { ... } void fun_error(size_t errnum) { ... }
对于需要进一步规格化的设计来说,可以使用
enum
或者#define
来设定每个错误返回值的名字设定名字
/*fun.h*/ #define ERR_CMPUTING 0 #define ERR_INVARG 1 #define ERR_BADRLT 2 /* 或者 */ enum { ERR_COMPUTING = 0, ERR_INVALIDARG, ERR_BADRESULT };
如此我们便可以在函数中使用错误的名字代号,而不是去记下每个数字的含义。对此也可以不使用数组这个数据结构来保存错误信息,而采用
switch
在代码中实现错误的处理switch
错误选择·/*fun.c*/ /* static const char * fun_err[] = { "Computing nagative!", "Invalid argument", "Bad result" }; */ ... void fun_error(size_t errnum) { switch(errnum) { case ERR_CMPUTING /*ERR_COMPUTING*/: fprintf(stderr, "..."); break; case ERR_INVARG /*ERR_INVALIDARG*/: fprintf(stderr, "..."); break; ... default : ... } return; }
如此做的好处便是,不再需要去安排数组的个数,而是直接在代码中展示。并且可以加上一些预处理,来实现开关错误显示。
开关错误
/* fun.c */ ... void fun_error(size_t errnum) { #if !defined(NOT_DEBUG) switch(errnum) { ... } #endif return; }
慎重使用
- 在我设计程序的过程中,尽量让错误提示减少,或者说用户不应该接触到错误以及处理错误,所以当一个程序没有必要提供给用户错误信息的时候,才是真正的完整程序,至于程序失败那又是量一种境况,例如备份程序可能由于文件的属性,而复制失败,这是不可避免的,此时将失败信息写入文档,呈现给用户即可。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论