出错处理

出错处理


1 出错处理选项

代码段对出错处理有几种选择:

  • 不做处理,这种方法不可取。
  • 检测错误并向用户提供有关信息。

最好的一种出错处理选择是由Linux编程环境通过系统日志记录错误信息,这样可以永久地记录错误信息。

2 C语言机制

2.1 assert宏

宏assert的作用是如果它测试的条件返回错误(0),则终止程序执行。它先计算表达式expression,若其值为假,则先向stderr打印出错信息,然后调用函数abort来终止程序运行。

#include <assert.h>
void assert(int expression);
2.2 使用预编译
2.3 标准库函数
#include <stdlib.h>
void abort(void);
void exit(int status);
void atexit(void (*fun)(void));
#include <stdio.h>
void perror(const char *s);
#include <string.h>
char *strerror(int errnum);
#include <errno.h>
int errno;

errno变量:Linux系统调用(要求内核服务的函数)和许多库函数(大多数是在数学库中)在出错时都要把全局变量errno设置为一个非0值。未避免虚假出错情况,调用这些函数前最好先把errno清零。

含义
EPERM1操作不允许
ENOENT2文件或目录不存在
ESRCH3进程不存在
EINTR4系统调用中断
EIO5I/O错误
ENXIO6设备或地址不存在
ECHILD10子进程不存在
EAGAIN11重试
ENOMEM12没有内存
EACCES13没有权限
EFAULT14地址错误
EBUSY16设备或资源忙
EEXIST17文件存在
ENODEV19设备不存在
ENOTDIR20不是目录
EISDIR21是目录
EINVAL22无效参数
ENOSPC28磁盘上没有空间
EPIPE32管道中断

abort函数:会导致程序异常终止,故程序在被终止前不能进行一些常规的清除工作。abort会向系统返回一个预定义值以便告诉系统这是一个不成功的终止。

exit函数:exit与abort类似,但它完成清理工作后才终止程序。

atexit函数:登记程序正常终止时要调用的函数,由exit调用或由main函数返回调用。

strerror函数:返回指向字符串的指针,该字符串描述了与错误码相关的提示信息。

perror函数:首先打印字符串参数s,后跟一个冒号,一个空格,接着时对应于errno值得出错消息,最后是一个换行符。

3 使用系统日志

Linux使用两个守护进程klogd(内核和运行在内核空间的程序)和syslogd(用户程序)提供系统日志功能。

#include <syslog.h>
void openlog(const char *ident, int option, int facility);
void syslog(int priority, char *format, ...);
void closelog(void);
/* 使用实例 */
syslog(LOG_WARNING | LOG_USER, "unable to open file %s %m\n", fname);
/* 日志消息 */
Mar 26 19:36:25 user syslog: unable to open file foo
No such file or directory
3.1 openlog函数

可选择的,若不调用openlog,则第一次调用syslog时自动调用openlog。

ident:将被加至每则日志消息中,一般时程序的名称。

option:指定各种选项的为屏蔽。

facility:可让配置文件说明来自不同设施的消息将以不同的方式进行处理。

option说明
LOG_PERROR除将日志消息发给syslogd以外,还将它写至标准出错
LOG_PID记录每条消息都要包含进程ID
3.2 syslog函数

产生一个日志消息。

priority:优先级,由级别和功能共同组成,值为级别和功能的位逻辑或值。

级别(level)严重性功能(facility)消息源
LOG_EMRG系统不可用LOG_AUTH授权程序
LOG_ALERT要求立即处理LOG_CONSOLE消息写入/dev/console
LOG_ERR错误条件LOG_DAEMON系统守护进程
LOG_WARNING警告条件LOG_KERN内核消息
LOG_NOTICE重要消息LOG_SECURITY安全子系统
LOG_INFO通报消息LOG_SYSLOGsyslogd内部消息
LOG_DEBUG调试或跟踪LOG_USER用户信息

format:指定写入日志的消息,特殊格式说明字符%m由strerror为errno分配的错误消息进行替换。

DEBUG | 调试或跟踪 | LOG_USER | 用户信息 |

format:指定写入日志的消息,特殊格式说明字符%m由strerror为errno分配的错误消息进行替换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值