C/C++ Linux 出错处理函数(strerror 与 perror)

我们知道,系统函数调用不能保证每次都成功,必须进行出错处理,这样一方面可以保证程序逻辑正常,另一方面可以迅速得到故障信息。

有两种方式:

1. strerror - 需要将错误信息输出到日志;

2. perror - 不需要将错误信息输出到日志。


一、strerror 

#include <errno.h>

#include <string.h>

char * strerror (int errnum);     /* See NOTES */

errnum:

    传入参数,错误编号的值,一般取 errno 的值;

返回值

    错误原因;

作用:

调用任何系统函数,当出错后,系统都会将错误代号赋值给全局变量errno,当出现错误后,我们就可以使用函数strerror传参errno,就会返回对应的出错信息了。

具体使用案例:

fprintf(stderr, "error, reason: %s\n", strerror(errno));

为什么说,需要将错误信息输出到日志文件时要使用strerror函数呢,因为strerror函数转换后返回char *指针,我们拿到这个指针后就可以将这个指针字符串写入日志文件中去啦。

下面会讲解为什么使用perno函数就不可以这样操作!

例:

1. 打开文件失败

#include <errno.h>         // errno
#include <string.h>        // strerror
#include <stdio.h>         // printf
#include <stdlib.h>        // exit

int main (int argc, char *argv[]) {

    FILE *fp = NULL;
    fp = fopen("./123/test.txt", "r");
    if (NULL == fp) {
        char *err = strerror(errno);
        fprintf(stderr, "open file error, reason: %s\n", err);
        //fprintf(stderr, "open file error, reason: %s\n", strerror(errno));
        exit(-1);
    }

    printf("open file success!\n");

    return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
open file error, reason: No such file or directory

其中,“No such file or directory” 就是我们通过strerror函数获取到的错误信息! 

2. 创建socket失败

#include <stdio.h>         // printf
#include <sys/types.h>     // socket
#include <sys/socket.h>    // socket
#include <stdlib.h>        // exit
#include <errno.h>         // errno
#include <string.h>        // strerror

int main (int argc, char *argv[]) {

    int sock = 0;

    sock = socket(-1, SOCK_STREAM, 0);
    if (-1 == sock) {
        fprintf(stderr, "create socket error, reason: %s\n", strerror(errno));
        exit(-1);
    }

    return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error, reason: Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过strerror函数获取到的错误信息! 


二、perror

#include <stdio.h>

#include <errno.h>

void perror (const char *s);    /* See NOTES */

s:

    传入参数,自定义的描述;

返回值:

    无;

作用:

向标准出错stderr 输出错原因 。

具体使用案例:

perror("create socket error ");

将需要提示的字符串传参给perror函数即可,它相当于:

fprintf(stderr, "create socket error : ", strerror(errno));

perror是直接向出错标准stderr输出错误原因!

例:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main (int argc, char *argv[]) {

    int sock = 0;

    sock = socket(-1, SOCK_STREAM, 0);
    if (-1 == sock) {
        perror("create socket error ");
        exit(-1);
    }

    return 0;
}

编译运行:

root@YGT:/home/ygt/echo_server/test# gcc errno.c -o errno
root@YGT:/home/ygt/echo_server/test# ./errno
create socket error : Address family not supported by protocol

其中,“Address family not supported by protocol” 就是我们通过perror函数输出的错误信息! 

因为他是直接向出错标准stderr输出错误原因,我们没法通过它获得错误信息字符串,所以也就没法将其写入日志文件中!


最后,调用系统的任何函数,当出现了错误,都可以使用以上两种方式进行打印输出错误信息,从而更轻易的帮助我们找出对应问题!

如果需要将错误信息输出到日志文件,使用strerror 函数;否则可以使用perror函数。

注意:以上介绍的 适用于任何Linux函数,例如open、write等。

完!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值