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. postMessage 跨域

    基于 postMessage 和 localStorage 的跨域本地存储方案 安·记 2014-09-07 2099 阅读 跨域 存储 localStorage HTML5 的 postMessag ...

  2. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  3. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

  4. python 作业 批量读取excel文件并合并为一张excel

    1 #!/usr/bin/env python 2 # coding: utf-8 3 4 def concat_file(a,b): 5 #如何批量读取并快速合并文件夹中的excel文件 6 imp ...

  5. http接口和web service接口测试区别是什么?

    1.web service有一套完整的协议标准,其中有soap协议,用来进行消息的传递. 2.soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式 Content-type设置 ...

  6. Mybatis的基础配置

    mybatis相关配置 mybatis核心文件配置的用法以及事例(初级) properties标签:获取外部的配置文件 <properties resource="jdbc.prope ...

  7. markdown语法入门笔记

    Markdown 是一种轻量级标记语言 1.标题 # ## ... ###### 分别为1到6级标题 (#后要加空格) 7个以上的#的没有效果 阿萨德阿萨德 阿萨德 2.字体 *斜体文本* _斜体文本 ...

  8. Python专题之详解enumerate和zip

    enumerate 第一个是枚举函数. 在我们的日常编程过程中,我们经常遇到一个问题. 在C语言和一些古老的语言中没有迭代器的概念,所以当我们想要遍历数组或容器时,我们只能使用下标.使用迭代器,我们的 ...

  9. php 正则金额验证

    $money_reg = '/^[1-9]\d*|^[1-9]\d*.\d+[1-9]$/';if(!preg_match($money_reg, $money)){ $this->ajaxEr ...

  10. python xmind转Excel(puppet洛洛原创)

    需求:将xmind文件转为Excel文件,并添加UI界面操作以降低操作难度. 这个需求一句话就讲清楚了,但实际上还需要做很多工作: 1,了解Xmind文件结构 2,提取Xmind文件分支内容(重点) ...