標籤:style io ar color 使用 sp on 檔案 div
本文中的錯誤是指在代碼編譯完全正確程式可啟動並執行情況下,因為沒有成功調用程式中的某些系統調用函數而產生的錯誤。往往這些系統調用函數通過傳回值(比如1,0,-1)來說明其是否調用成功,而程式員需要知道詳細的錯誤資訊,因此自建錯誤捕獲函數很有必要。
(1)errno和strerror()
errno它是一個整形的錯誤碼。當發生錯誤的時候,系統自動將錯誤碼賦給errno。使用下面的方法可以獲得具體的錯誤描述:
- void my_err(interror)
- {
- printf("error: %s with errno: %d\n",strerror(error),error);
- exit(1);
- }
- intmain()
- {
- ..............
- my_err(errno);
- ..............
- }
其中char *strerror(int errnum);是通過errnum來擷取錯誤描述,errnum即所傳遞的errno。該函數末尾的exit(1)使得程式發生錯誤時退出。但應該包含庫函數stdlib.h。
下面進行測試,測試程式(原始碼在本文末尾。)使用open()函數建立檔案,因為要建立的檔案已存在,而且使用了O_EXCL參數,因此open()會產生錯誤。結果如下:
- [email protected]:~/code$ ./error
- error: File exists with errno: 17
該方法可以詳細顯示錯誤資訊以及錯誤碼。但不能顯示錯誤出現的行數。
(2)perror()
其函數原型為:void perror(const char *s)。s一般是函數名。該函數會先將函數名列印出來,然後再列印出錯誤資訊。錯誤資訊與errno相對應。第二個參數__LINE__是一個宏,表示當前的行數。使用方法:
- void my_err2(const char* err_string,int line)
- {
- fprintf(stderr,"error: line:%d ",line);
- perror(err_string);
- exit(1);
- }
- }
- int main()
- {
- .................
- my_err2("open",__LINE__);
- ................
- }
測試結果如下:
- [email protected]:~/code$ ./error
- error: line:29 open: File exists
- }
該方法可以顯示錯誤資訊以及錯誤出現的行數。
以上方法是在《linux C編程》中常用的方法,我適當的作了小調整。現在將這兩種方法結合起來:
- void my_err3(constchar*err_string,intline,interror)
- {
- printf("error: line:%d %s():%s with errno:%d\n",line,err_string,strerror(error),error);
- exit(1);
- }
- intmain()
- {
- ................
- my_err3("open",__LINE__,errno);
- ................
- }
測試結果如下:
- [email protected]:~/code$ ./error
- error: line:30 open():File exists with errno:17
這樣就可以顯示錯誤碼,錯誤描述,錯誤出現的行數以及出現錯誤的函數。對於和我一樣的新手來說,這裡特別要注意的是宏__LINE__前後的那個橫線是兩個連續的底線,而不是_LINE_,否則會出現錯誤。
原始碼如下:
說明:本程式只作測試用,為了同時顯示三種錯誤捕獲函數的資訊,因此屏蔽了每個函數的exit(1)。另外本文標頭檔函數用“”是因為顯示問題,沒有什麼特別意義。
linux c 系統報錯