出错处理
• 1.使用标准错误输出
例子: 判断键盘上输入的字符是不是 0-9
#include <stdio.h> main() { char ch; scanf("%c",&ch); if(!isdigit(ch)) { fprintf(stderr,"Please input a digit char\n"); } }
打印errno的值:
printf("errno is: %d\n",errno);
• 2.使用errno全局变量 ,errno中的内容应该在出错后立即使用,因为出错后不立即使用,可能在调用其他函数时又产生了错误,导致errno的原有值呗覆盖!
a. 使用 perror
#include <stdio.h> main() { FILE *fp; if((fp = fopen("./test.txt","r")) == NULL) { perror("fopen"); return; } printf("Open file success!\n"); fclose(fp); return; }
b. 使用全局变量 erron
#include <stdio.h>
#include <errno.h>
main()
{
FILE *fp;
if((fp = fopen("./test.txt","r")) == NULL)
{
fprintf(stderr,"fopne faild%s\n",strerror(errno));
return;
}
printf("Open file success!\n");
fclose(fp);
return;
}
• 3.使用出错信号处理 : 使用标准错误输出和errno变量进行错误处理,都是在可以预知的情况下进行的错误处理,所以预先编码进行错误处理,除此之外还有一种错误,是编码人员不知道何时会出现异常,此时就可以使用信号进行错误处理
例子:在被0除 的情况下,系统内核将向进程发送信息SIGFPE,编程人员可以在程序中捕获该信号进行处理
#include <stdio.h> #include <errno.h> #include <signal.h> void Handle_Sigfpe(int signo) { fprintf(stderr,"%d\n",signo); fprintf(stderr,"catch the signal!\n`"); exit(0); } main() { int i,m,n; if(signal(SIGFPE,Handle_Sigfpe) == SIG_ERR) { perror("signal"); return; } for(i=0;i<10;i++) { scanf("%d %d",&m,&n); printf("%d / %d = %d\n",m,n,m/n); } }
• 4.使用assert断言
#include <stdio.h> #include <assert.h> #include <stdlib.h> int main( void ) { FILE *fp; fp = fopen( "test.txt", "w" ); //以可写的方式打开一个文件,如果不存在就创建一个同名文件 assert( fp ); //所以这里不会出错 fclose( fp ); fp = fopen( "noexitfile.txt", "r" ); //以只读的方式打开一个文件,如果不存在就打开文件失败 assert( fp ); //这里出错 fclose( fp ); //该语句将不会执行 return 0; }
• 5.内存泄露的检查
• 6.其他可能的内存错误