在 C 中抛出异常
本文介绍如何处理 C 编程语言中的异常或错误。
异常概述
尝试除以零是可能触发异常的情况示例,这是对程序执行时可能发生的异常情况的反应。
在异常的帮助下,控制可以从程序的一个部分传递到另一个部分。
处理 C 语言中的异常
尽管 C 不提供对错误处理(也称为异常处理)的直接支持,但有一些方法可以在 C 中完成错误处理。为了首先避免问题,程序员必须采取预防措施并检查返回的值 由功能。
如果出现错误,许多 C 函数调用会返回值 -1 或 NULL。 因此,可以使用例如 if 语句快速有效地完成对这些返回值的快速测试。
在 C 中处理错误的 setjmp() 函数
使用 setjmp()
函数可以模拟其他编程语言的异常处理功能。 第一次调用 setjmp()
时,一个参考点被存储到程序执行的当前点。
只要包含 setjmp()
的函数不返回或退出,该参考点将保持有效。 当您调用 longjmp()
时,执行将返回到相应的 setjmp()
调用发生的位置。
setjmp()
的参数是jmp buf,它是一个可以包含执行上下文的类型,它在第一次执行时(设置返回点时)返回0。 当程序第二次执行时,调用 longjmp()
时返回提供给 longjmp()
的值。
先前提供给 setjmp()
的 jmp buf 需要作为 longjmp()
的输入,以及应作为返回值传递给 setjmp()
的值。
当深层嵌套的函数调用发生故障时,将返回值验证回您想要返回的位置会很烦人。 这是 setjmp()
和 longjmp()
最有用的地方。
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
int main(void) {
int value;
jmp_buf environment;
value = setjmp(environment); // value is set to 0 the first time this is called
if (value !=0)
{
printf("You have just executed a longjmp call, and the return value is %d.", value); // now, value is 1, passed from longjmp()
exit(0);
}
puts("Performing longjmp call\n");
longjmp(environment, 1);
return(0);
}
输出:
Performing longjmp call
You have just executed a longjmp call, and the return value is 1
在 C 中使用 errno 实现错误处理
当在 C 中执行函数调用时,称为 errno 的变量会自动分配一个代码(值),可用于确定遇到的问题。 此代码可用于查明错误发生的位置。
它是一个全局变量,告诉你调用任何函数时发生了什么样的错误,它在 errno.h 头文件中指定。 各种错误由 errno 变量的不同代码或值表示。
以下是许多不同的 errno 值的列表,每个值对应一个特定的含义。
errno 值 | 错误信息 |
---|---|
1 | 不允许操作 |
2 | 没有那个文件或目录 |
3 | 没有这样的过程 |
4 | 中断的系统调用 |
5 | 输入输出错误 |
6 | 没有这样的设备或地址 |
7 | 参数列表太长 |
8 | 执行格式错误 |
9 | 错误文件编号 |
10 | 没有子进程 |
11 | 再试一次 |
12 | 内存不足 |
13 | 权限被拒绝 |
源代码
#include <stdio.h>
#include <errno.h>
int main()
{
FILE * fp;
fp = fopen("abc.txt", "r");
printf("The value of errno is: %d\n", errno);
return 0;
}
输出:
The value of errno is: 2
在本例中,errno 设置为 2,表示不存在具有该名称的文件或目录。
使用 perror() 和 strerror() 打印错误信息
遇到的错误种类由上面获得的 errno 值指示。
如果需要显示错误描述,则可以使用两个函数来显示与错误号相关的文本消息。
perror()
显示您提供的字符串,插入一个空格,然后是冒号,最后,它描述了 errno 值。 strerror()是指errno当前值的描述。
源代码:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main ()
{
FILE *fp;
fp = fopen(" abc.txt ", "r");
printf("The value of errno is: %d\n", errno);
printf("The error message is: %s\n", strerror(errno));
perror("perror Message");
return 0;
}
输出:
The value of errno is: 2
The error message is: No such file or directory
Message from perror: No such file or directory
处理除以零错误
在处理错误或异常时,这是迄今为止最常被提出来讨论的问题。
我们经常会提出数学断言,例如:
c = a / b;
但我们常常忘记,在某些情况下,b 的值很可能为零。
整数除以零在数学中是不允许的。 人们常常认为解决方案永远无法实现,意味着解决方案是无限的。
不幸的是,这种情况并非如此。 在此特定情况下,未指定正确的响应。 使用 C 中管理异常和错误的原则,以下程序将解决此问题。
源代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int dividend;
int divisor;
int quotient;
printf("Enter the value for dividend: ");
scanf("%d", ÷nd);
printf("Enter the value for divisor: ");
scanf("%d", &divisor);
if(divisor == 0)
{
fprintf(stderr, "\nDivision by zero is not possible!\n");
exit(-1);
}
quotient = dividend / divisor;
fprintf(stderr, "The value of quotient: %d\n", quotient );
exit(0);
return 0;
}
输出:
Input a zero value.
Enter the value for dividend: 100
Enter the value for divisor: 0
Division by zero is not possible!
Input a non-zero value.
Enter the value for dividend: 100
Enter the value for divisor: 5
The value of quotient: 20
相关文章
在 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 语言中的头文件用于定义同名源文件中实现的函数的接口。