C語言錯誤處理
因此C編程不提供錯誤處理的直接支持,但作為一個係統編程語言,它為您提供了在較低的水平訪問返回值的形式。大多數C或甚至是Unix函數調用返回-1或NULL的情況下,任何的錯誤,並設置錯誤代碼errno設置是全局變量,並表示任何函數調用時發生了錯誤。可以在<error.h>頭文件中定義的各種錯誤代碼。
所以,C程序員可以檢查返回值,並可以采取適當的動作取決於返回值。作為一個很好的做法,開發人員應該設置 errno 為0 在程序初始化時。0表示冇有在程序冇有錯誤。
errno, perror() 和 strerror()
C編程語言提供perror()和strerror()函數可以被用來顯示與錯誤號相關聯的文本消息。
-
perror()函數顯示了傳遞給它的字符串,後跟一個冒號,一個空格,當前errno值的文字表述。
-
strerror()函數返回一個指向當前errno值的文字表述。
讓我們試著來模擬錯誤情況,並嘗試打開一個不存在的文件。在這裡使用兩種功能來顯示的使用,但可以使用打印一個錯誤或多種方式。需要注意一點是,應該使用標準錯誤文件流輸出的所有錯誤。
#include <stdio.h> #include <errno.h> #include <string.h> extern int errno ; int main () { FILE * pf; int errnum; pf = fopen ("unexist.txt", "rb"); if (pf == NULL) { errnum = errno; fprintf(stderr, "Value of errno: %d ", errno); perror("Error printed by perror"); fprintf(stderr, "Error opening file: %s ", strerror( errnum )); } else { fclose (pf); } return 0; }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Value of errno: 2 Error printed by perror: No such file or directory Error opening file: No such file or directory
除零錯誤
它是在一次除以任意數時,程序員不檢查是否一個除數為零,最後它創建一個運行時錯誤的程序。
下麵的代碼修複此通過檢查除數為0 - 除以零:
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "Division by zero! Exiting... "); exit(-1); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d ", quotient ); exit(0); }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Division by zero! Exiting...
程序退出狀態
它是一種常見的做法是退出情況下是一個成功的操作之後為EXIT_SUCCESS 值。這裡,EXIT_SUCCESS是一個宏,它被定義為0。
如果在程序中的錯誤條件發生錯誤,那麼應該退出其定義狀態EXIT_FAILURE的值為-1。因此,讓我們寫上麵的程序如下:
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 5; int quotient; if( divisor == 0){ fprintf(stderr, "Division by zero! Exiting... "); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d ", quotient ); exit(EXIT_SUCCESS); }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Value of quotient : 4