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 ...
随机推荐
- uniapp使用swiper组件做tab切换动态获取高度
swiper对高度进行了限制,所以说通常做出了tab切换的效果但是内容经常被截取掉???? 所以我在前端做了一个动态获取高度的功能 选项卡标题也就是tab切换的效果 选项卡内容区域的高度自适应 因为进 ...
- shell脚本之编程基础介绍
1.shell脚本简介 1.1 shell是什么? shell是一个命令解释器,它在操作系统的最外层负责直接与用户对话,把用户的输入解释给操作系统:并处理各种各样的操作系统的输入,将结果输出到屏幕返回 ...
- Flask中的RESTFul
RESTFul 1.什么是RESTFul? 1.1 简介 REST即表述性状态传递(英文:Representational State Transfer, 简称REST)是Roy Fielding博士 ...
- ThinkPHP中,运用PHPExcel,将数据库导出到Excel中
1.将PHPExcel插件放在项目中,本人位置是ThinkPHP文件夹下,目录结构如下/ThinkPHP/Library//Vendor/...2.直接根据模型,配置三个变量即可使用./** * Ex ...
- 已经编译安装的nginx/tenginx编译增加新模块
只适用于自行编译安装的nginx配置 业务变更带来的Nginx增加模块需求 由于业务从php转为go开发,需要用到Http2的协议.这种协议在Nginx上需要http_v2_module这个模块的支持 ...
- MeterSphere开发者手册
什么是 MeterSphere MeterSphere 是一站式的开源企业级持续测试平台, 涵盖测试跟踪.接口测试.性能测试. 团队协作等功能,兼容 JMeter 等开源标准,有效助力开发和测试团队充 ...
- MySQL全面瓦解6:查询的基本操作
概述 提到查询,就回到我们第四篇的SQL语言分类了,DQL(Data QueryLanguage),也就是数据查询语言,实际就是从数据库中获取数据的一种命令方式.我们给数据库发送一个查询语句的命令,数 ...
- 09-jQuery案例:爱好选择器
爱好选择器HTML 1 <!DOCTYPE html> 2 <head> 3 <meta charset="UTF-8"> 4 <titl ...
- 9个JavaScript日常开发小技巧
1.生成指定范围的数字 在某些情况下,我们会创建一个处在两个数之间的数组.假设我们要判断某人的生日是否在某个范围的年份内,那么下面是实现它的一个很简单的方法 1 2 3 4 5 6 let start ...
- 自制 os 极简教程1:写一个操作系统有多难
为什么叫极简教程呢?听我慢慢说 不知道正在阅读本文的你,是否是因为想自己动手写一个操作系统.我觉得可能每个程序员都有个操作系统梦,或许是想亲自动手写出来一个,或许是想彻底吃透操作系统的知识.不论是为了 ...