在 C 中处理错误
这篇简短的文章是关于可用于处理 C 语言程序中的错误的不同方法的讨论。
C 中的错误处理
尽管 C 不直接支持错误处理(或异常处理),但语言中仍然有处理错误的方法。 程序员必须首先测试函数返回值并尝试防止错误发生。
可以快速完成对这些返回值的快速测试。 例如,一个 if
语句,因为许多 C 函数调用在发生错误时返回 -1 或 NULL。
C语言可以使用不同的方法来处理不同类型的错误。 本文讨论了其中一些。
- 使用全局变量 errno。
- 通过 C 语言使用 perror() 和 strerror() 函数。
- 使用函数的退出状态。
使用全局变量 errno
在库文件 errorno.h 中定义了一个全局变量 errno。 在 C 编程语言中,一个名为 errno 的变量被自动赋予一个代码(值),可用于指定发生的错误。
错误类型由 errno 的不同代码(值)表示。 下面是一些不同的 errno 值及其解释的列表。
错误码 | 说明 |
---|---|
1 | 不允许此操作。 |
2 | 找不到文件或目录。 |
3 | 未找到函数。 |
4 | 任何系统调用中断。 |
5 | 输入或输出错误。 |
6 | 未找到此类设备。 |
7 | 传递的参数列表比指定的长。 |
8 | 执行函数错误。 |
9 | 坏文件号错误。 |
10 | 未找到智利进程。 |
11 | 再试一次。 |
12 | 内存不足错误。 |
13 | 访问权限被拒绝。 |
让我们考虑一个示例代码段,我们将在其中尝试打开一个不存在的文件。 然后我们将看到 errno 变量的值。
代码示例:
#include <stdio.h>
#include <errno.h>
int main()
{
FILE * file;
//we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
printf("The errorno Value is: %d\n ", errno);
return 0;
}
在上面的代码示例中,我们为 File 创建了一个对象,然后调用了 fopen()
函数,以便它可以打开一个文件进行读取。 但是我们给了一个在目录中找不到的文件名。
所以它会产生一个错误,并且会设置一个 errno 值。 然后我们将打印它的值。
输出:
从输出结果来看,返回的错误号为2。从上表可以匹配到,2表示“没有找到那个文件或目录”。
使用 perror() 和 strerror() 函数
遇到的错误类型由上面获得的 errno 值指示。
如果需要错误描述,可以使用两个函数来显示链接到错误编号的文本消息。 它们是 perror() 和 strerror()。
-
perror()
函数显示用户定义的错误文本消息,后跟为该错误号设置的实际消息。void perror (const char *str)
str
是您需要在实际错误消息之前显示的自定义消息的字符串。 -
strerror 返回为传递给它的 errno 设置的文本消息。
char *strerror (int errnum)
我们将修改前面打开一个不存在的文件的示例,并通过 perror()
和 strerror()
显示错误消息。
#include <stdio.h>
#include <errno.h>
int main()
{
FILE * file;
//we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
if (file == NULL)
{
printf("Value of error number: %d\n", errno);
perror("Error message by perror");
printf("Error Message from strerror : %s\n", strerror(errno));
} else
{
fclose (file);
}
return 0;
}
在上面的代码段中,我们打印了 errno
值,然后使用 perror
打印错误信息,然后通过 strerror
。
输出:
使用 EXIT_STATUS
为了指示成功或不成功的终止,C 标准指定了两个常量宏:EXIT SUCCESS
和 EXIT FAILURE
,它们可以传递给 exit()
。 这些宏在 stdlib.h 中列出。
我们将进一步修改前面的示例,如果找不到文件并在案例文件中找到成功退出,则调用失败退出。
代码示例:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
FILE * file;
//we're trying to open a file that doesn't exist
file = fopen("samepleFile.txt", "r");
if (file == NULL) {
int errorNumber = errno;
printf("Value of error number: %d\n", errno);
perror("Error message by perror");
printf("Error Message from strerror : %s\n",
strerror(errno));
exit(EXIT_FAILURE);
} else {
fclose (file);
exit(EXIT_SUCCESS);
}
printf("Program exiting");
return 0;
}
在上面的代码示例中,我们在条件语句的两种情况下都包含了退出函数。 我们在程序退出之前添加了一个 printf
函数。
此消息将不会打印,因为该程序之前已退出。
输出:
总结
C 没有明确支持异常处理。 但是,我们可以使用某些错误处理原语(即库函数)在 C 中实现足够的异常处理。
相关文章
在 C 语言中使用 typedef enum
发布时间:2023/05/07 浏览次数:181 分类:C语言
-
本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。
C 语言中的 extern 关键字
发布时间:2023/05/07 浏览次数:114 分类:C语言
-
本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量
C 语言中的 #ifndef
发布时间:2023/05/07 浏览次数:186 分类:C语言
-
本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。