出错处理
• 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.其他可能的内存错误