C 语言错误处理

对于任何一个编程语言来说,错误处理都是非常重要的,如果你开发过高级语言如Java,你就会看到 Java 处理 错误的方式是通过 tra-catch-finally 来处理的, java 通过这种方式,在发生错误的时候,会被它捕获,并程序会跳转到 catch 里面执行相应的逻辑;

C作为一种系统编程语言,但是很遗憾它并不提供这样便捷的方式,它对错误的处理不是这样直接的,而是通过以返回值的形式允许您访问底层错误数据,而这个错误定义在 errno.h 头文件

C语言程序发生错误时,会把返回1或NULL, 同时会把错误信息保存在全局变量里,编辑人员可以根据相应的错误码到 error.h 头文件找到相应的错误信息,并做相应的处理!

C 错误处理函数 errno、perror() 和 strerror()

  • perror() 函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。
  • strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。

C 文件不存在错误处理示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main()
{
    FILE * file;
    int errerno;
    file = fopen ("pangugle.txt", "rb");
    if (file == NULL)
    {
      errerno = errno;
      fprintf(stderr, "errerno = %d\n", errno);
      perror("通过 perror 输出错误");
      fprintf(stderr, "open file error: %s\n", strerror( errerno ));
    }
    else
    {
      fclose (file);
    }

    return 0;
}

运行结果为

errerno = 2
通过 perror 输出错误: No such file or directory
open file error: No such file or directory

C setjump()、 longjump()错误处理

这两个函数是类似于高级语言 try-catch

  • setjump相当于try
  • longjump相当于catch

注意 longjump 是全局的

示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <setjmp.h>

jmp_buf jmpBuf;

float handleDivide(int x, int y)
{
    if(y == 0)
    {
        longjmp(jmpBuf, -1);
    }
    return x / y;
}

int main()
{
    int rs = setjmp(jmpBuf);
    // 第一次运行
    if(rs == 0)
    {
        handleDivide(3, 0);
    }
    else if(rs == -1)
    {
        printf("除数不能为0");
    }
    return 0;
}