C语言讲义——错误处理

errno

  • C语言不提供对错误处理的直接支持。
  • 以返回值的形式表示是否出错。

  • 在发生错误时,大多数的C函数调用返回1或NULL。
  • 同时设置一个错误代码errno(全局变量),表示在函数调用期间发生了错误。
#include <errno.h> 或 #include <stdlib.h>
  • 可以通过检查返回值,然后根据返回值决定怎么处理
  • 把errno设置为0(没有错误),是一种良好的编程习惯
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
main() {
    errno = 0;
    // 平方根
    int y = sqrt(-1);
    printf("errno = %d\n",errno);

    if (errno != 0) {
        printf("程序出错...\n");
    }
}
此代码中errno=33,是一个宏定义。
#define EDOM 33 /* Math argument out of domain of func */

更多errno点击这里查看

perror()和strerror()

  • perror()显示错误信息
    来自:stdio.h
  • strerror(errno)将错误信息返回一个指针,指向描述错误信息的字符串
    来自:string.h
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <math.h>
main() {
    errno = 0;
    // 平方根
    int y = sqrt(-1);
    printf("errno = %d\n",errno);

    perror("perror报错");
    printf("strerror报错: %s\n", strerror(errno));
    if (errno!=0) {
        printf("程序出错...\n");
    }
}
errno = 33
perror报错: Domain error
strerror报错: Domain error
程序出错...

应用举例

#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno ;
main () {
    FILE * pf;
    errno = 0;
    pf = fopen ("unexist.txt", "rb");
    if (pf == NULL) {
        printf("错误号: %d\n", errno);
        perror("perror报错");
        printf("strerror报错: %s\n", strerror(errno));
    } else {
        fclose (pf);
    }
}

*诊断·断言

#include <stdio.h>
#include <assert.h>
main() {
    int n1 = 1;
    int n2 = 0;
    // 不满足条件,中断
    assert(n2!=0);
    int n3 = n1/n2;
    printf("---%d---",n3);
}
Assertion failed!

Program: C:\Users\AndyMi\Documents\C\Project3.exe
File: main.c, Line 10

Expression: n2!=0

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

*使用信号处理错误

include <signal.h>提供了处理异常情况的工具,称为“信号”。

  • signal()函数安装一个信号处理函数。

1648799-20190715213802431-802698144.png

  • raise()触发信号。

1648799-20190715213812199-91604366.png

#include <stdio.h>
#include <signal.h>

void printErr(int sig) {
    printf("出现错误%d", sig);
}
main () {
    //说明:
    //被安装的函数需要一个参数
    //这个参数是信号编码
    //这里使用SIGINT宏,表示终止进程或中断进程,对应为2
    signal(SIGINT, printErr);
    int n1 = 10;
    int n2 = 0;
    if (n2 == 0) {
        raise(SIGINT);
    } else {
        printf("除法结果为:%d", n1/n2);
    }
}

转载于:https://www.cnblogs.com/tigerlion/p/11191708.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值