1. assert()
assert宏的原型定義在<assert.h>中,其作用是如果它的條件返回錯誤,則終止程序執行,原型定義:
#include <assert.h>
void assert( int expression );
assert的作用是現計算表達式 expression ,如果其值為假(即為0),那麽它先向stderr打印一條出錯信息,然後通過調用 abort 來終止程序運行。
請看下面的程序清單badptr.c:
#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;
}
[root@localhost error_process]# gcc badptr.c
[root@localhost error_process]# ./a.out
a.out: badptr.c:14: main: Assertion `fp' failed.
已放棄
使用assert的缺點是,頻繁的調用會極大的影響程序的性能,增加額外的開銷。
在調試結束後,可以通過在包含#include 的語句之前插入 #define NDEBUG 來禁用assert調用,示例代碼如下:
#include
#define NDEBUG
#include
用法總結與註意事項:
1)在函數開始處檢驗傳入參數的合法性
如:
int resetBufferSize(int nNewSize)
{
//功能:改變緩沖區大小,
//參數:nNewSize 緩沖區新長度
//返回值:緩沖區當前長度
//說明:保持原信息內容不變 nNewSize<=0表示清除緩沖區
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);
...
}
2)每個assert只檢驗一個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗
不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);
好: assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);
3)不能使用改變環境的語句,因為assert只在DEBUG個生效,如果這麽做,會使用程序在真正運行時遇到問題
錯誤: assert(i++ < 100)
這是因為如果出錯,比如在執行之前i=100,那麽這條語句就不會執行,那麽i++這條命令就沒有執行。
正確: assert(i < 100)
i++;
4)assert和後面的語句應空一行,以形成邏輯和視覺上的一致感
5)有的地方,assert不能代替條件過濾
2. abort()
函數名: abort
功 能: 異常終止一個進程
用 法: void abort(void);
頭文件:#include
說明:abort函數是一個比較嚴重的函數,當調用它時,會導致程序異常終止,而不會進行一些常規的清除工作,比如釋放內存等。
程序例:
#include
#include
int main(void)
{
puts( "About to abort....\n" );
abort();
puts( "This will never be executed!\n" );
exit( EXIT_SUCCESS );
}
[root@localhost error_process]# gcc abort.c
[root@localhost error_process]# ./a.out
About to abort....
已放棄
3. exit()
表頭文件: #include
定義函數: void exit(int status);
exit()用來正常終結目前進程的執行,並把參數 status 返回給父進程,而進程所有的緩沖區數據會自動寫回並關閉未關閉的文件。
它並不像abort那樣不做任何清理工作就退出,而是在完成所有的清理工作後才退出程序。
4. atexit(設置程序正常結束前調用的函數)
表頭文件 #include
定義函數 int atexit (void (*function)(void));
atexit()用來設置一個程序正常結束前調用的函數。當程序通過調用 exit()或從 main 中返回時,參數function所指定的函數會先被調用,然後才真正由exit()結束程序。
返回值 如果執行成功則返回 0,否則返回-1,失敗原因存於 errno 中。
#include
#include
void my_exit(void)
{
printf( "Before exit....\n" );
}
int main(void)
{
atexit( my_exit );
return 0;
}
[root@localhost error_process]# gcc atexit.c
[root@localhost error_process]# ./a.out
Before exit....
5. strerror(返回錯誤原因的描述字符串)
表頭文件 #include
定義函數 char * strerror(int errnum);
strerror() 用來依參數 errnum 的錯誤代碼來查詢其錯誤原因的描述字符串,然後將該字符串指針返回。這時如果把 errno 傳個strerror,就可以得到可讀的提示信息,而不再是一個冷冰冰的數字了。
返回值 返回描述錯誤原因的字符串指針。
#include
#include
int main(void)
{
int i;
for ( i=0; i<10; i++ )
{
printf( "%d:%s\n", i, strerror(i) );
}
return 0;
}
[root@localhost error_process]# gcc strerror.c
[root@localhost error_process]# ./a.out
0:Success
1:Operation not permitted
2:No such file or directory
3:No such process
4:Interrupted system call
5:Input/output error
6:No such device or address
7:Argument list too long
8:Exec format error
9:Bad file descriptor
[root@localhost error_process]#
- Jul 04 Sat 2015 13:12
Linux編程—出錯處理之assert,abort,exit,atexit,strerror
close
全站熱搜
留言列表
發表留言