《Linux C编程实战》笔记:出错处理

这一节书上把它放到线程这一章,按理说应该在前面就讲了

头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以得到错误的信息

程序开始执行时,变量errno被初始化为0。很多库函数在执行过程中遇到错误时就会将errno设置为相应的错误码。函数被成功调用时,它们不修改errno的值。因此,当一个函数被成功调用,errno的值可能不为零,它的非零值由前面的函数设置。所以不能根据errno的值来判断一个函数执行是否成功。当函数调用失败时( 函数返回-1或NULL),errno 值才有意义。

示例程序1

以下是一个示例程序,改程序通过打开一个文件,如果由于某种原因文件不能被打开时,就可以得到一个相应的errno值,检查其对应错误码,可以得到错误的原因。

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
int main(){
    FILE *stream;
    char *filename="test";
    errno=0;
    stream=fopen(filename,"r");//这个是C语言的文件打开,和之前讲的Linux的不一样,不过效果都是一样的
    if(stream==nullptr)
        printf("open file %s failed,errno is %d\n",filename,errno);
    else printf("open file %s successfully\n",filename);
}

如果是文件不存在的情况下运行,结果如下

 2对应的错误码是ENOENT,然后就知道错误原因是:文件或目录不存在。

错误码

错误码是定义在errno.h中的宏,通常以字母E开头,后面由一串大写字母或数字组成。

以下是一些错误码的宏,当然不可能说全记住,看看就好。

  1. 成功:

    • 宏:0
    • 描述:表示操作成功完成。
  2. 通用错误:

    • 宏:EINVAL
    • 描述:无效的参数。
  3. 文件相关错误:

    • 宏:ENOENT
    • 描述:文件或目录不存在。
    • 宏:EEXIST
    • 描述:文件或目录已存在。
  4. 内存相关错误:

    • 宏:ENOMEM
    • 描述:内存不足。
  5. 权限相关错误:

    • 宏:EACCES
    • 描述:权限不足。
  6. 网络相关错误:

    • 宏:ECONNREFUSED
    • 描述:连接被拒绝。
    • 宏:ETIMEDOUT
    • 描述:操作超时。
  7. 管道和进程相关错误:

    • 宏:EPIPE
    • 描述:管道破裂。
  8. socket 相关错误:

    • 宏:EADDRINUSE
    • 描述:地址已经在使用中。
    • 宏:EADDRNOTAVAIL
    • 描述:地址不可用。
  9. IO 相关错误:

    • 宏:EIO
    • 描述:IO 错误。
  10. 数学库相关错误:

    • 宏:EDOM
    • 描述:域错误。
    • 宏:ERANGE
    • 描述:结果太大,无法表示。
  11. 线程相关错误:

    • 宏:EPERM
    • 描述:操作不允许。
  12. 信号相关错误:

    • 宏:EINTR
    • 描述:被中断的系统调用。

错误的提示信息

出现错误时,可以打印出相应的错误提示信息。

strerror函数

#include<string.h>
char *strerror(int errnum);

这个函数在头文件string.h中声明。它会根据参数errnum提供的错误码获取一个描述错误信息的字符串,函数的返回值为指向该字符串的指针。errnum的值通常就是errno。

perror函数

这个函数我好早之前就介绍过了,《Linux C编程实战》笔记:文件读写-CSDN博客

#include<stdio.h>
void perror(const char *message);

 perror()打印错误信息到stderr, stderr 在Linux中通常就是指屏幕或命令行终端。调用perror()时,
如果参数message是一个空指针,perror 仅仅根据errno打印出对应的错误提示信息。如果提供一
个非空的值,perro会把此message加在其输出信息的前面。perror会添加一个冒号和空格message
和错误信息分开,以便区分。

示例程序2

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
FILE *open_file(const char *filename){
    FILE *stream;
    errno=0;
    stream=fopen(filename,"r");
    if(stream==nullptr){
        printf("can not open the file %s. reason:%s\n",filename,strerror(errno));//用strerror获得错误的信息
        exit(-1);
    }
    else return stream;
}
int main(){
    const char *filename="test";
    open_file(filename);
    return 0;
}

strerror实际上就是通过之前的错误码得到错误码对应的错误信息字符串,然后打印出来。

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《C MySQL8.0数据库跨平台编程实战笔记》是一本介绍如何在不同平台上使用C语言和MySQL8.0数据库进行编程的实用指南。本书从数据库的基本概念开始讲解,包括数据库的设计、表的创建和管理,以及SQL语句的基本使用方法。然后深入探讨了C语言和MySQL8.0数据库的结合,通过示例代码演示了如何在不同操作系统上使用C语言连接和操作MySQL8.0数据库。 本书以实战为主,介绍了在Windows、Linux和MacOS等不同平台上使用C语言编写跨平台的数据库程序的方法。读者可以通过学习本书,掌握在不同平台上使用C语言和MySQL8.0数据库的技巧和方法。此外,本书还介绍了一些实用的编程技巧和调试方法,帮助读者更好地应用C语言和MySQL8.0数据库进行开发和调试。 作者通过丰富的实例和详细的讲解,使读者能够快速掌握使用C语言和MySQL8.0数据库进行跨平台编程的技能。不论是初学者还是有一定开发经验的读者,都可以从本书中获得丰富的知识和经验。本书内容通俗易懂,深入浅出,适合作为C语言和数据库编程的入门指南,也适用于数据库开发人员和C语言程序员作为进阶学习和实践的参考。 总之,《C MySQL8.0数据库跨平台编程实战笔记》是一本实用性强、内容丰富的技术书籍,对于想要学习C语言和MySQL8.0数据库跨平台编程的读者来说是一本难得的好书。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值