关闭

C语言的那些小秘密之异常处理

发表于:2011-12-21 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:bigloomy(CSDNblog)    来源:51Testing软件测试网采编

  在接下来的main()函数中我们定义了一个函数指针p,使其指向了 func()函数,接下来我们使用了一句 signal_call(1,p)();代码,实现了func函数调用,那么这到底是怎么实现的呢?那么我们来分析下,前面的signal_call(1,p)返回的是一个函数指针,在代码中我们发现其实返回的就是p,所以signal_call(1,p)();就可以变形为p(),看到这种形式我们这就可以很清楚的看出,它调用的就是我们代码中的func()函数了。现在读者明白了signal()函数的实现方法,接下来我们来看看一段使用signal捕捉除数为0时候的异常代码。

  1. #include <stdio.h>     
  2. #include <signal.h>      
  3. #include <setjmp.h>      
  4. #include <stdlib.h>      
  5. #include <float.h>      
  6. #include <string.h>   
  7.   
  8. jmp_buf buf;               
  9. int     err;             
  10.   
  11. void handler( int num )    
  12. {    
  13.     err = num;    
  14.     printf( "发生浮点计算异常\n");    
  15.     longjmp( buf, 1);    
  16. }  
  17. int main( void )    
  18. {    
  19.     double a, b;    
  20.     char str[20];    
  21.     int ret;  
  22.     _control87( 0, _MCW_EM );  
  23.     if( signal( SIGFPE, handler ) == SIG_ERR )  
  24.     {    
  25.         printf("绑定失败\n" );    
  26.         abort();       
  27.     }  
  28.     ret = setjmp( buf );    
  29.     if(0 == ret )    
  30.     {    
  31.         printf("请输入被除数:");    
  32.         scanf("%lf",&a);    
  33.         printf("请输入除数:");    
  34.         scanf("%lf",&b);    
  35.         printf( "a / b = %4.3g\n", a/b);    
  36.         printf("发生异常时候不会被执行的语句\n");    
  37.     }  
  38.   
  39.     return 0;    
  40. }

  没有发生异常时候的运行结果:

  1. 请输入被除数:123  
  2. 请输入除数:3  
  3. a / b =   41  
  4. 发生异常时候不会被执行的语句  
  5. Press any key to continue

  发生异常时候的运行结果:

  1. 请输入被除数:12  
  2. 请输入除数:0  
  3. 发生浮点计算异常  
  4. Press any key to continue

54/5<12345>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号