迹忆客 专注技术分享

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

在 C 中处理错误

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

这篇简短的文章是关于可用于处理 C 语言程序中的错误的不同方法的讨论。


C 中的错误处理

尽管 C 不直接支持错误处理(或异常处理),但语言中仍然有处理错误的方法。 程序员必须首先测试函数返回值并尝试防止错误发生。

可以快速完成对这些返回值的快速测试。 例如,一个 if 语句,因为许多 C 函数调用在发生错误时返回 -1 或 NULL。

C语言可以使用不同的方法来处理不同类型的错误。 本文讨论了其中一些。

  1. 使用全局变量 errno。
  2. 通过 C 语言使用 perror() 和 strerror() 函数。
  3. 使用函数的退出状态。

使用全局变量 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 值。 然后我们将打印它的值。

输出:

errno 演示程序的输出

从输出结果来看,返回的错误号为2。从上表可以匹配到,2表示“没有找到那个文件或目录”。


使用 perror() 和 strerror() 函数

遇到的错误类型由上面获得的 errno 值指示。

如果需要错误描述,可以使用两个函数来显示链接到错误编号的文本消息。 它们是 perror() 和 strerror()。

  • perror() 函数显示用户定义的错误文本消息,后跟为该错误号设置的实际消息。
    void perror (const char *str)
    
    str 是您需要在实际错误消息之前显示的自定义消息的字符串。
  • strerror 返回为传递给它的 errno 设置的文本消息。
    char *strerror (int errnum)
    
    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

输出:

perror and strerror output


使用 EXIT_STATUS

为了指示成功或不成功的终止,C 标准指定了两个常量宏:EXIT SUCCESSEXIT 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 函数。

此消息将不会打印,因为该程序之前已退出。

输出:

exit value output


总结

C 没有明确支持异常处理。 但是,我们可以使用某些错误处理原语(即库函数)在 C 中实现足够的异常处理。

转载请发邮件至 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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便