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 */
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语言讲义——错误处理的更多相关文章
- C语言常见错误中英文对照表
C语言常见错误中英文对照表(网络搜索及经验积累不断更新中) 常见错误中英文对照表 fatal error C1003: error count exceeds number; stopping co ...
- [日常] Go语言圣经-错误,函数值习题
Go语言圣经-错误 1.panic异常.panic是来自被调函数的信号,表示发生了某个已知的bug 2.任何进行I/O操作的函数都会面临出现错误的可能 3.错误是软件包API和应用程序用户界面的一个重 ...
- 如何处理C++构造函数中的错误——兼谈不同语言的错误处理
用C++写代码的时候总是避免不了处理错误,一般来说有两种方式,通过函数的返回值或者抛出异常.C语言的错误处理一律是通过函数的返回值来判断的,一般是返回0.NULL或者-1表示错误,或者直接返回错误代码 ...
- 常见C语言编译错误解析【转】
C语言编译错误信息及说明1. 在函数 ‘transform’ 中:7: 错误:expected ‘;’ before ‘{’ token 解释:‘{’之前的某个语句缺少分号‘;’: 2. 在函数 ...
- 【Go语言】错误与异常处理机制
①error接口 Go语言中的error类型实际上是抽象了Error()方法的error接口 type error interface { Error() string } Go语言使用该接口进行标准 ...
- 常见C语言内存错误
前言 C语言强大的原因之一在于几乎能掌控所有的细节,包括对内存的处理,什么时候使用内存,使用了多少内存,什么时候该释放内存,这都在程序员的掌控之中.而不像Java中,程序员是不需要花太多精力去处理垃圾 ...
- 多语言业务错误日志收集监控工具Sentry 安装与使用
Sentry 是一个实时事件日志记录和汇集的平台.其专注于错误监控以及提取一切事后处理所需信息而不依赖于麻烦的用户反馈. Sentry是一个日志平台, 它分为客户端和服务端,客户端(目前客户端有Pyt ...
- Go 语言基础——错误处理
#### 学习目标 掌握错误处理 掌握自定义错误处理 掌握defer关键字的使用 ------ #### 错误处理 GO没有异常处理机制 Go语言引入了一个关于错误处理的标准模式,即error接口,该 ...
- go语言的错误处理
1.系统自己抛异常 //go语言抛异常 func test3_1() { l := [5] int {0,1,2,3,4} var index int = 6 fmt.Println(l) l[ind ...
随机推荐
- NB-IoT的同步信号解析
NB-IoT的小区搜索和LTE的小区搜索是类似的,每个UE都是通过对同步信号的检测,来实现与小区时间和频率上的同步,以此来获取小区的ID.NB-IoT的同步信号包括NPSS和NSSS. NPSS用于完 ...
- ES6--数组部分基础知识
数组Array的相关方法 1.Array.from()方法 Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象 ...
- EBAZ4205学习资源整理
EBAZ4205是一块矿机的控制板,芯片是ZYNQ7010,某鱼上应该不超过30元就能买一块,垃圾佬狂喜 经过不复杂的操作就能进行正常开发,由于货量比较大现在已经有很多大佬写了很多很多好的资料,这里我 ...
- [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...
- js音乐播放器【简洁】
辞职的第二天没有去找工作还,准备回家. 但到了火车站才发现沃特玛的买的票不是在这个火车站坐. 这就耽误了行程...... 说出来真舒服!!!淦 代码 这里已经上传到码云了,大家可以直接引用. 目前只有 ...
- Lte Design Documentation之RRC
RRC 特点 RRC模型在模拟器中提供以下功能 生成(在eNB中)和解释(在UE中)信息块(尤其是MIB和SIB1, SIB2) 初始化小区选择 RRC连接建立过程 RRC重新配置程序, 支持以下方式 ...
- Python调用Java(基于Ubuntu 18.04)
最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...
- VMware 虚拟机下CentOS 7连接网络
查看主机网络配置 ipconfig 1.在centos打开终端命令 2. 输入命令 cd /etc/sysconfig/network-scripts/ 进入文件 输入 ls查看此文件夹下的文件 3 ...
- 极客mysql16
1.MySQL会为每个线程分配一个内存(sort_buffer)用于排序该内存大小为sort_buffer_size 1>如果排序的数据量小于sort_buffer_size,排序将会在内存中完 ...
- Linux mysql 修改密码 三种方式(转载)
注明:本文为转载,原文地址:https://www.cnblogs.com/chuckjam/archive/2018/08/10/9456255.html 前言 有时我们会忘记Mysql的密码,或者 ...