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()函数安装一个信号处理函数。

  • raise()触发信号。

#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);
}
}

C语言讲义——错误处理的更多相关文章

  1. C语言常见错误中英文对照表

    C语言常见错误中英文对照表(网络搜索及经验积累不断更新中) 常见错误中英文对照表 fatal error C1003:  error count exceeds number; stopping co ...

  2. [日常] Go语言圣经-错误,函数值习题

    Go语言圣经-错误 1.panic异常.panic是来自被调函数的信号,表示发生了某个已知的bug 2.任何进行I/O操作的函数都会面临出现错误的可能 3.错误是软件包API和应用程序用户界面的一个重 ...

  3. 如何处理C++构造函数中的错误——兼谈不同语言的错误处理

    用C++写代码的时候总是避免不了处理错误,一般来说有两种方式,通过函数的返回值或者抛出异常.C语言的错误处理一律是通过函数的返回值来判断的,一般是返回0.NULL或者-1表示错误,或者直接返回错误代码 ...

  4. 常见C语言编译错误解析【转】

    C语言编译错误信息及说明1. 在函数 ‘transform’ 中:7: 错误:expected ‘;’ before ‘{’ token    解释:‘{’之前的某个语句缺少分号‘;’: 2. 在函数 ...

  5. 【Go语言】错误与异常处理机制

    ①error接口 Go语言中的error类型实际上是抽象了Error()方法的error接口 type error interface { Error() string } Go语言使用该接口进行标准 ...

  6. 常见C语言内存错误

    前言 C语言强大的原因之一在于几乎能掌控所有的细节,包括对内存的处理,什么时候使用内存,使用了多少内存,什么时候该释放内存,这都在程序员的掌控之中.而不像Java中,程序员是不需要花太多精力去处理垃圾 ...

  7. 多语言业务错误日志收集监控工具Sentry 安装与使用

    Sentry 是一个实时事件日志记录和汇集的平台.其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈. Sentry是一个日志平台, 它分为客户端和服务端,客户端(目前客户端有Pyt ...

  8. Go 语言基础——错误处理

    #### 学习目标 掌握错误处理 掌握自定义错误处理 掌握defer关键字的使用 ------ #### 错误处理 GO没有异常处理机制 Go语言引入了一个关于错误处理的标准模式,即error接口,该 ...

  9. go语言的错误处理

    1.系统自己抛异常 //go语言抛异常 func test3_1() { l := [5] int {0,1,2,3,4} var index int = 6 fmt.Println(l) l[ind ...

随机推荐

  1. 拖拽编写SVG图形化工具(二)

    getAttributesNs/setAttributesNs element.setAttributeNS(namespace,name,value) namespace 是指定属性的命名空间的一个 ...

  2. 码农会锁,synchronized 对象头结构(mark-word、Klass Pointer)、指针压缩、锁竞争,源码解毒、深度分析!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 感觉什么都不会,从哪开始呀! 这是最近我总能被问到的问题,也确实是.一个初入编程职场 ...

  3. Spring入门-----------------属性注入和对象注入

    属性注入即通过setter方法注入bean的属性或依赖对象. 属性注入使用<property>元素,使用name属性指定bean的属性的名称,value属性或<value>子节 ...

  4. 优雅手撕bind函数(面试官常问)

    优雅手撕bind函数 前言: 为什么面试官总爱让实现一个bind函数? 他想从bind中知道些什么? 一个小小的bind里面内有玄机? 今天来刨析一下实现一个bind要懂多少相关知识点,也方便我们将零 ...

  5. django 框架模型之models常用的Field

    1. django 模型models 常用字段          1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一 ...

  6. NOIP 2012 P1081 开车旅行

    倍增 这道题最难的应该是预处理... 首先用$set$从后往前预处理出每一个点海拔差绝对值得最大值和次大值 因为当前城市的下标只能变大,对于点$i$,在$set$中二分找出与其值最接近的下标 然后再$ ...

  7. boston.csv 完整版 508个数据集

    https://pan.baidu.com/s/1C1Llx8cTu5xBdK9GuDZ11A 提取码:u6cm

  8. php支付宝签名验证类

    <?php /* * 黎明互联 * https://www.liminghulian.com/ */ class RSA { /** * RSA签名 * @param $data 待签名数据 * ...

  9. javascript中什么是函数

    函数的定义 在javascript中函数是一段可以被执行或调用任意次数的JavasScript代码,在数据类型中属于"function".函数也拥有属性和方法,因此函数也是对象. ...

  10. RocketMQ4.x安装部署

    1.下载安装包:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip ...