编写一个软件时,软件的健壮性时特别值得考虑的问题。使用C++时可以使用异常捕获机制,在设计完软件的模块架构的时候然后再设计异常捕获架构,一般来说需要设计一个异常捕获网来捕获程序中可能的异常。
对于异常的处理,有些情况下没有办法实现程序的自恢复,这时候只能无奈的输出程序的出错的一些信息。在我看来,这些信息具体又分为静态信息和动态信息。静态信息是编译器期间确定的一些属性,动态期间是在运行时期间才能确定的属性。
例如,程序模块a中的函数f的第l行出现错误,在输出错误的时候我们要能够输出这些定位错误的信息。利用C语言提供的内置宏可以得到这些信息,常用的内置宏为:__FILE__,__LINE__,__FUNCTION__,__TIME__,分别为文件名,行号,函数名,以及该模块对应得源文件被预处理器处理的时间。这些信息都是编译期间确定的,也就是我所说的静态错误信息。
下面是一个例子:
这个是头文件:tmp_header.h
- /*
- *Author:Chaos Lee
- *Date:2012-02-26 16:52
- */
- #ifndef TMP_HEADER_H
- #define TMP_HEADER_H
- #include<stdio.h>
- #define MSGDEBUG fprintf(stderr,"Error Occured at:\nFile:%s\nFunction:%s\nLine:%d\nDate:%s\nTime:%s\n",__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIME__);
- #endif
下面是源文件:
- /*
- *Author:Chaos Lee
- *Date:2012-02-26 16:55
- */
- #include"tmp_header.h"
- int main()
- {
- MSGDEBUG;
- return 0;
- }
输出结果如下:
- Error Occured at:
- File:tmp_test.c
- Function:main
- Line:8
- Date:Feb 26 2012
- Time:17:04:27
还有一种情况就是动态信息,可以确定模块在内存中的位置,这就是常见的堆栈跟踪信息。可以调用库函数backtrace实现堆栈跟踪,这个放在下一篇文章中。
还有一个库函数也是方便调试的,就是assert函数,下面是一个assert函数的例子。assert函数根据参数情况来决定程序的运行,如果参数判定为假或者0,将对进程发出ABORT信号,默认的情况下,程序运行结束。
- /*
- *Author:Chaos Lee
- *Date:2012-02-26 10:37
- */
- #include<stdio.h>
- #include<assert.h> //for assert
- #include<signal.h> //for signal
- void sig_abrt(int signo)
- {
- printf("signal 'Aborted' catched.\n");
- }
- void installSignalHandler()
- {
- signal(SIGABRT,sig_abrt);
- }
- int main()
- {
- int input=1;
- installSignalHandler();
- while(input)
- {
- scanf("%d",&input);
- assert(input);
- printf("you have entered:%d\n",input);
- }
- return 0;
- }
程序运行结果如下:
- 32
- you have entered:32
- 54
- you have entered:54
- 0
- assert_test: assert_test.c:23: main: Assertion `input' failed.
- signal 'Aborted' catched.
- Abort
本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/790175