曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6144|回复: 2
打印 上一主题 下一主题

出错处理

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-6-26 20:20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
错误检查
函数执行失败时,一般都会返回一个特定的值,如 -1、空指针。这些值只能说明有错误发生,但错误的原因没有说明。
头文件 errno.h 定义了变量 errno ( 含义是 error number ),它存储了错误发生时的错误码,通过错误码可以得到错误的描述信息,在 errno.h 文件开头处有定义:
#ifndef errno
extern int errno;
#endif
程序开始执行时,变量 errno 被初始化为 0 。很多库函数在执行过程中遇到错误时,就会将 errno 设置为相应的错误码。函数被成功调用时,它们不修改 errno 的值。因此,当一个函数被成功调用,errno 的值可能不为零,它的非零值由前面的函数设置。所以不能根据 errno 的值来判断一个函数执行是否成功。当函数调用失败时 ( 函数返回 -1 或 NULL ),errno 值才有意义。如下例:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main()
{
    FILE    *stream;
    char    *filename = "test-e";

    errno = 0;

    stream = fopen(filename, "r");
    if ( stream == NULL ) {
        printf("open file %s failed, errno is %d\n", filename,errno);
    } else {
        printf("open file %s successfully\n", filename);
    }
}
运行及输出
beyes@linux-beyes:~/C> ./checkerrno.exe
open file test-e failed, errno is 2
说明:由于 test-e 文件不存在,所以打开失败,errno=2 ,可以查得错误码为 ENOENT ( 文件或目录不存在 )。如果文件存在,但不具有读写权限,那么返回 errno=13,对应错误码为 EPERM 。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
沙发
 楼主| 发表于 2009-6-26 22:02:03 | 只看该作者

错误码

错误码是一些定义在 errno.h 中的宏,通常以字母E ( 代表 errno )开头,后面由一串大写字母或数字组成。

注意: 在定义自己的宏时,要避免与这些保留的宏名冲突,除了 EWOULDBLOCK 和 EAGAIN 具有相同的值,其余所有的错误码的值都是非负且惟一的,因此在 switch 语句中可以使用它们。

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

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
板凳
 楼主| 发表于 2009-6-26 22:52:40 | 只看该作者

错误的提示信息

当程序出现错误时,可以打印出相应的错误提示信息,以便用户修改该错误。函数 strerror() 和 perror() 可以通过错误码获取标准的错误提示信息。详细介绍见:
http://www.groad.net/bbs/read.php?tid=895
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-3 23:22 , Processed in 0.091019 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表