出错处理
•
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.其他可能的内存错误
分享到:
相关推荐
C语言--程序设计导论 C语言--程序设计导论
C语言44-高级PWM输出两路互补SPWM(STC32G-DEMO-CODE-220311kw)C语言44-高级PWM输出两路互补SPWM(STC32G-DEMO-CODE-220311kw)C语言44-高级PWM输出两路互补SPWM(STC32G-DEMO-CODE-220311kw)C语言44-高级PWM输出...
Linux下C语言编程--时间概念 Linux下C语言编程--时间概念 Linux下C语言编程--时间概念 Linux下C语言编程--时间概念
C语言09-看门狗复位测试程序(STC32G-DEMO-CODE-220311kw)C语言09-看门狗复位测试程序(STC32G-DEMO-CODE-220311kw)C语言09-看门狗复位测试程序(STC32G-DEMO-CODE-220311kw)C语言09-看门狗复位测试程序(STC32G-...
C语言45-内部RTC时钟程序(STC32G-DEMO-CODE-220311kw)C语言45-内部RTC时钟程序(STC32G-DEMO-CODE-220311kw)C语言45-内部RTC时钟程序(STC32G-DEMO-CODE-220311kw)C语言45-内部RTC时钟程序(STC32G-DEMO-CODE-...
计算机二级-c语言考试-c语言学习-第4讲完整.pptx
Linux下C语言编程--进程的创建
对Linux下C语言编程--线程操作作了详细的说明
C语言35-板上的32K xdata测试程序(STC32G-DEMO-CODE-220311kw)C语言35-板上的32K xdata测试程序(STC32G-DEMO-CODE-220311kw)C语言35-板上的32K xdata测试程序(STC32G-DEMO-CODE-220311kw)C语言35-板上的32K ...
基于LINUX系统下c语言-----学生管理系统common.h文件.rar
C语言05-利用定时器测量脉冲宽度(STC32G-DEMO-CODE-220311kw)C语言05-利用定时器测量脉冲宽度(STC32G-DEMO-CODE-220311kw)C语言05-利用定时器测量脉冲宽度(STC32G-DEMO-CODE-220311kw)C语言05-利用定时器测量...
C语言00-端口模式设置(STC32G-DEMO-CODE-220311kw)C语言00-端口模式设置(STC32G-DEMO-CODE-220311kw)C语言00-端口模式设置(STC32G-DEMO-CODE-220311kw)C语言00-端口模式设置(STC32G-DEMO-CODE-220311kw)...
C语言52-UART转LIN总线报文测试程序(STC32G-DEMO-CODE-220311kw)C语言52-UART转LIN总线报文测试程序(STC32G-DEMO-CODE-220311kw)C语言52-UART转LIN总线报文测试程序(STC32G-DEMO-CODE-220311kw)C语言52-UART转...
C语言30-红外发射程序(NEC码)-使用PWM4产生38KHz载波(STC32G-DEMO-CODE-220311kw)C语言30-红外发射程序(NEC码)-使用PWM4产生38KHz载波(STC32G-DEMO-CODE-220311kw)C语言30-红外发射程序(NEC码)-使用PWM4产生38...
C语言49-CAN总线扩展帧收发测试(STC32G-DEMO-CODE-220311kw)C语言49-CAN总线扩展帧收发测试(STC32G-DEMO-CODE-220311kw)C语言49-CAN总线扩展帧收发测试(STC32G-DEMO-CODE-220311kw)C语言49-CAN总线扩展帧收发...
C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4测试程序(STC32G-DEMO-CODE-220311kw)C语言02-Timer0-Timer1-Timer2-Timer3-Timer4...
C语言26-高级PWM5-PWM6-PWM7-PWM8输出测试程序(STC32G-DEMO-CODE-220311kw)C语言26-高级PWM5-PWM6-PWM7-PWM8输出测试程序(STC32G-DEMO-CODE-220311kw)C语言26-高级PWM5-PWM6-PWM7-PWM8输出测试程序(STC32G-DEMO...
C语言25-高级PWM1-PWM2-PWM3-PWM4,驱动P6口呼吸灯实验程序(STC32G-DEMO-CODE-220311kw)C语言25-高级PWM1-PWM2-PWM3-PWM4,驱动P6口呼吸灯实验程序(STC32G-DEMO-CODE-220311kw)C语言25-高级PWM1-PWM2-PWM3-PWM4...
C语言39-通过USB发送命令读取ADC测试程序(STC32G-DEMO-CODE-220311kw)C语言39-通过USB发送命令读取ADC测试程序(STC32G-DEMO-CODE-220311kw)C语言39-通过USB发送命令读取ADC测试程序(STC32G-DEMO-CODE-220311kw...
C语言38-2.4寸ILI9325驱动TFT显示屏实验程序-带触摸功能(STC32G-DEMO-CODE-220311kw)C语言38-2.4寸ILI9325驱动TFT显示屏实验程序-带触摸功能(STC32G-DEMO-CODE-220311kw)C语言38-2.4寸ILI9325驱动TFT显示屏实验...