出错处理

1.错误检查

函数执行失败时,一般都会返回一个特定的值比如-1,空指针,这些只能说明有错误发生,但具体的错误原因却没有说明,在头文件erron.h中定义变量errno(错误码),可以通过错误码,得到错误的描述信息. 程序开始执行时,errno被初始化为0,很多库函数在执行过程中遇到错误时将errno设置为相应的错误码,函数被调用成功时,它们不修改errno的值,所以不能根据errno的值来判断一个函数是否执行成功,当函数执行失败时,errno的值才有意义. 错误码是一些定义在errno.h中的宏,通常以字母E开头,下面是一些常见的错误码解释:

  • ENOMEM:表示内存不足,系统不能再提供更多的虚拟内存.
  • EIO:输入输出错误,在读写磁盘时经常遇到.
  • ENXIO:指定的设备或地址不存在.
  • EPERM:禁止操作,只有具备相应权限的进程才能执行该操作.
  • ESRCH:没有经常与给定的进程ID相匹配.
  • ENOENT:文件或目录不存在;
  • EINTR:函数调用被中断,如果发生这种错误,要重新调用函数.
  • E2BIG:参数过长;
  • ENOEXEC:可执行文件格式无效.
  • EBADF:文件描述符错误;
  • ECHILD:子进程不存在;
  • EBUSY:资源正在占用,不能共享.
  • EINVAL:无效的参数.
  • EMFILE:当前进程打开的文件已达到上限,不能在打开其它文件.
  • EFBIG:文件太大;
  • ENOTDIR:当需要目录时指定了一个非目录的文件.
  • EISDIR:文件是一个目录;

函数strerror和函数perror可以通过错误码获取标准的错误信息提示: strerrror在头文件string.h中申明: #include <string.h> char * strerror(int errnum); strerror函数根据参数errnum提供的错误码来获取一个描述符的错误信息提示, perror()函数申明在头文件<stdio.h>中; perror()打印错误信息到stderr,调用perror时,如果参数message是一个空指针 ,perror仅仅根据errno打印出对应的错误信息提示,如果提供一个非空的值 ,perror会把message加在其输出信息的前面.来看个例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
FILE *open_file(char *filename)
{
	FILE *stream;
	errno=0;
	stream=fopen(filename,"r");
	if(stream==NULL)
	{
		printf("不能打开文件%s!,原因:%s\n",filename,strerror(errno));
		exit(-1);
	}
	else
	{
		return stream;
	}
}
int main(void)
{
	char *filename = "test";
	
	open_file(filename);
	return 0;
}

结果:L

yang@liu:~/syc/第八章$ ./a.out
不能打开文件test!,原因:No such file or directory

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值