C 语言编程 — 异常处理
目录
前文列表
《程序编译流程与 GCC 编译器》
《C 语言编程 — 基本语法》
《C 语言编程 — 基本数据类型》
《C 语言编程 — 变量与常量》
《C 语言编程 — 运算符》
《C 语言编程 — 逻辑控制语句》
《C 语言编程 — 函数》
《C 语言编程 — 高级数据类型 — 指针》
《C 语言编程 — 高级数据类型 — 数组》
《C 语言编程 — 高级数据类型 — 字符串》
《C 语言编程 — 高级数据类型 — 枚举》
《C 语言编程 — 高级数据类型 — 结构体与位域》
《C 语言编程 — 高级数据类型 — 共用体》
《C 语言编程 — 高级数据类型 — void 类型》
《C 语言编程 — 数据类型的别名》
《C 语言编程 — 数据类型转换》
《C 语言编程 — 宏定义与预处理器指令》
异常处理
C 语言不提供直接的错误处理支持,而是以返回值的形式允许访问底层数据,在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码 errno。errno 该错误代码是全局变量,表示在函数调用期间发生了错误,可以在 errno.h 头文件中找到各种各样的错误代码。
所以,C 程序员可以通过检查返回值,并根据返回值决定采取哪种适当的动作,以此来进行异常处理。在程序初始化时,应该把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。
perror() 和 strerror() 输出异常信息
C 语言提供了 perror()
和 strerror()
标准函数来显示与 errno 错误代码相关的错误文本消息。
perror()
:自动拼接传入函数的字符串实参、:
、以及当前 errno 错误代码对应的错误文本信息。strerror()
:返回一个指针(等同于字符串变量名),指向当前 errno 错误代码对应的错误文本信息。
#include <stdio.h>
#include <errno.h>
#include <string.h>
/* errno 默认值为 0 */
extern int errno;
int main() {
FILE * pf;
int errnum;
pf = fopen("unexist.txt", "rb");
/* 函数调用错误时返回 NULL */
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "ERROR num: %d\n", errnum);
perror("PERROR message");
fprintf(stderr, "STRERROR message: %s\n", strerror(errnum));
}
else {
fclose(pf);
}
return 0;
}
运行:
$ ./main
ERROR num: 2
PERROR message: No such file or directory
STRERROR message: No such file or directory
程序退出状态
- 如果程序成功执行完并退出时,会带有一个正常退出状态宏 EXIT_SUCCESS,数值为 0。
- 如果程序出现异常并退出时,会带有错误退出状态值 EXIT_FAILURE,数值为 -1。
#include <stdio.h>
#include <stdlib.h>
int main() {
int dividend = 20;
int divisor = 5;
int quotient;
if (divisor == 0) {
fprintf(stderr, "除数为 0 退出运行...\n");
exit(EXIT_FAILURE);
}
quotient = dividend / divisor;
fprintf(stderr, "quotient 变量的值为: %d\n", quotient );
exit(EXIT_SUCCESS);
}
C 语言编程 — 异常处理的更多相关文章
- c#基础语言编程-异常处理
异常的定义 异常就是程序中的运行时错误,当出现异常时,系统会捕获这个错误并抛出一个异常.若程序没有提供处理该异常的代码,系统会挂起这个程序. 常见异常的类型 System.Exception 最泛化的 ...
- 华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
- 采访:Go语言编程
Go语言是由Google在2009年11月份公布的,它的目标是要应对软件开发所面临的最新挑战.Go语言特别被设计为快速(包括在编译时).支持多核的语言,并且兼顾了动态语言的简单性和静态类型语言的安全性 ...
- C语言编程实现Linux命令——who
C语言编程实现Linux命令--who 实践分析过程 who命令是查询当前登录的每个用户,它的输出包括用户名.终端类型.登录日期及远程主机,在Linux系统中输入who命令输出如下: 我们先man一下 ...
- 个人c语言编程风格总结
总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- 混合语言编程:启用CLR(公共语言运行时编译)让C#调用C++
前言 关于混合C#和C++的编程方式,本人之前写过一篇博客(参见混合语言编程:C#使用原生的Directx和OpenGL),在之前的博客中,介绍了在C#的Winform和WPF下使用原生的Direct ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- 第二章 C语言编程实践
上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...
随机推荐
- 黄吉:如何适配OpenHarmony自有音频框架ADM?
编者按:在 OpenHarmony 生态发展过程中,涌现了大批优秀的代码贡献者,本专题旨在表彰贡献.分享经验,文中内容来自嘉宾访谈,不代表 OpenHarmony 工作委员会观点. 黄吉 中国科学院软 ...
- Java 包装类:原始数据类型与迭代器
Java Iterator Iterator 接口提供了一种迭代集合的方法,即顺序访问集合中的每个元素.它支持 hasNext() 和 next() 方法,用于检查是否存在下一个元素以及获取下一个元素 ...
- C语言 01 概述
历史 C 语言是一门面向过程的计算机编程语言,于 1972 年诞生于贝尔实验室. C 语言是丹尼斯·里奇(Dennis Ritchie)以 B 语言为基础发展而来,因此他被称为 C 语言之父. C 语 ...
- JS从图片base64数据中获取图片的宽高
// js从base64数据中获取宽高 var image = new Image(); image.src = "data:image/png;base64," + base64 ...
- openGauss内存引擎中的索引
一.索引 索引是一种用于快速查询和检索数据的数据结构.常见的索引结构有: B 树, B+树和 Hash. 索引的作用就相当于目录的作用.打个比方: 我们在查字典的时候,如果没有目录,那我们就只能一页一 ...
- 【我与openGauss的故事】如何管理数据库安全(第一部分)
前言 2021 年 6 月 10 日国家颁布数据安全法对我们国家来说具有重大意义 信息安全法 梳理几点重要意义: (一) 对数据的有效监管实现了有法可依,填补了数据安全保护立法的空白,完善了网络空间安 ...
- HTML基础之input系列
<form action=""> <div> 用户名:<input type="text" name="user&quo ...
- 豪鹫闲谈:IBM x3650 m4服务器安装centos6.4系统
豪鹫闲谈:IBM x3650 m4服务器安装centos6.4系统 2013-08-25 11:46:29 标签: IBM x3650 centos6.4 原创作品,允许转载,转载时请务必以超链接 ...
- Git中 fork, clone,branch
一.是什么 fork fork,英语翻译过来就是叉子,动词形式则是分叉,如下图,从左到右,一条直线变成多条直线 转到git仓库中,fork则可以代表分叉.克隆 出一个(仓库的)新拷贝 包含了原来的仓库 ...
- Kafka 的分片和副本机制
我们在使用 Kafka 生产和消费消息的时候,肯定是希望能够将数据均匀地分配到所有服务器上.比如在日志收集场景,数据量是非常巨大的,例如大批量的集群每分钟产生的日志都能以 GB 计,所以如何将这么大的 ...