迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

在 C 中抛出异常

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文介绍如何处理 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", &dividend);

    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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便