C 语言中的错误处理
因此,C 语言编程不提供对错误处理的直接支持,因为 C 语言中没有关键字可以阻止错误或异常突然终止程序。但是,程序员可以使用其他函数进行错误处理。
您可以使用 errno 在 C 语言中高效地处理错误。此外,其他可用于错误处理的函数包括 perror、strerror、ferror 和 clearererr。
errno 变量
C 是一种系统编程语言。它以返回值的形式提供较低级别的访问。大多数 C 语言甚至 Unix 函数调用在发生任何错误时都会返回 -1 或 NULL,并设置错误代码 errno。它被设置为全局变量,用于指示在任何函数调用期间发生的错误。您可以在
因此,C 程序员可以检查返回值,并根据返回值采取适当的操作。在初始化程序时将 errno 设置为 0 是一个好习惯。值为 0 表示程序中没有错误。
下表列出了 errno 值及其对应的错误消息 -
errno 值 | 错误 |
---|---|
1 | 操作不允许 |
2 | 没有此文件或目录 |
3 | 没有此进程 |
4 | 系统调用中断 |
5 | I/O 错误 |
6 | 没有此设备或地址 |
7 | 参数列表太长 |
8 | 执行格式错误 |
9 | 文件编号错误 |
10 | 无子进程 |
11 | 重试 |
12 | 内存不足 |
13 | 权限被拒绝 |
示例
请看以下示例 -
#include <stdio.h> #include <errno.h> int main() { FILE* fp; // 打开不存在的文件 fp = fopen("nosuchfile.txt", "r"); printf("Value of errno: %d ", errno); return 0; }
输出
它将产生以下输出 -
Value of errno: 2
C 编程语言提供了 perror() 和 strerror() 函数,可用于显示与 errno 关联的文本消息。
perror() 函数
显示传递给它的字符串,后跟冒号、空格,然后是当前 errno 值的文本表示。
void perror(const char *str);
示例
在上面的例子中,"errno = 2"与消息 No such file or directory 关联,可以使用 perror() 函数打印该消息。
#include <stdio.h> #include <errno.h> int main(){ FILE* fp; // 打开不存在的文件 fp = fopen("nosuchfile.txt", "r"); printf("Value of errno: %d ", errno); perror("Error message:"); return 0; }
输出
运行此代码时,将产生以下输出 -
Value of errno: 2 Error message: No such file or directory
strerror() 函数
此函数返回指向当前 errno 值文本表示的指针。
char *strerror(int errnum);
让我们使用此函数显示 errno=2 的文本表示
示例
请看以下示例 -
#include <stdio.h> #include <errno.h> int main() { FILE* fp; // 打开不存在的文件 fp = fopen("nosuchfile.txt", "r"); printf("Value of errno: %d ", errno); printf("The error message is : %s ", strerror(errno)); return 0; }
输出
Value of errno: 2 he error message is : No such file or directory
ferror() 函数
此函数用于检查文件操作期间是否发生错误。
int ferror(FILE *stream);
示例
此处,我们尝试读取以 w 模式打开的文件。ferror() 函数用于打印错误消息。
#include <stdio.h> int main(){ FILE *fp; fp = fopen("test.txt","w"); char ch = fgetc(fp); // 尝试从可写文件读取数据 if(ferror(fp)){ printf("File is opened in writing mode! You cannot read data from it!"); } fclose(fp); return(0); }
输出
运行代码并检查其输出 −
File is opened in writing mode! You cannot read data from it!
clearerr() 函数
clearerr() 函数用于清除文件流的文件结束指示符和错误指示符。
void clearerr(FILE *stream);
示例
请看以下示例 -
#include <stdio.h> int main(){ FILE *fp; fp = fopen("test.txt","w"); char ch = fgetc(fp); // 尝试从可写文件读取数据 if(ferror(fp)){ printf("File is opened in writing mode! You cannot read data from it! "); } // 清除文件流中的错误指示 // 后续的 ferror() 不会显示错误 clearerr(fp); if(ferror(fp)){ printf("Error again in reading from file!"); } fclose(fp); return(0); }
除以零的错误
一个常见的问题是,程序员在进行任何数的除法运算时,都没有检查除数是否为零,最终会导致运行时错误。
示例 1
以下代码通过在除法之前检查除数是否为零来修复此错误 -
#include <stdio.h> #include <stdlib.h> int 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... Program Exit Status
如果程序在操作成功后退出,通常的做法是返回 EXIT_SUCCESS 状态。此处,EXIT_SUCCESS 是一个宏,其定义为 0。
示例 2
如果程序中出现错误,并且您正在退出,则应该返回 EXIT_FAILURE 状态,其定义为"-1"。因此,我们将上述程序编写如下:
#include <stdio.h> #include <stdlib.h> int 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