14.openssl编程——错误处理
14.1 概述
程序设计时,一般通过函数的返回值来判断是否调用成功。设计良好的函数以及好的错误处理能版主调用者快速找到错误:
*错误码
*出错文件以及行号
*错误原因
*出错函数
*出错库
*出错模块与类别信息
*错误堆栈信息等
14.2 数据结构
openssl中,通过unsgined long 类型来存放错误信息。它包含三部分内容:库代码、函数代码以及错误原因代码。
#define ERR_GET_LIB(l) (int)((((unsigned long)l)>>24L)&0xffL)
#define ERR_GET_FUNC(l) (int)((((unsigned long)l)>>12L)&0xfffL)
#define ERR_GET_REASON(l) (int)((l)&0xfffL)
a.主要数据接哦古有两个
ERR_STRING_DATA
{
unsigned long error;
const char *string;
} ERR_STRING_DATA;
该数据结构的内容由各个功能模块来设置。
b.struct err_state_st {
int err_flags[ERR_NUM_ERRORS];
unsigned long err_buffer[ERR_NUM_ERRORS];错误码,包含库、函数以及错误原因信息
char *err_data[ERR_NUM_ERRORS];存放操作信息
int err_data_flags[ERR_NUM_ERRORS];存放err_data相关标记
const char *err_file[ERR_NUM_ERRORS];错误文件名
int err_line[ERR_NUM_ERRORS];错误的行号
int top, bottom;用于指明ERR_STATE的使用状态。
}
14.3 主要函数
a.ERR_add_error_data
在本层错误的err_data元素中添加说明信息。
b.ERR_clear_error
清除所有错误信息。如果不清楚所有错误信息,可能会有其他无关错误遗留在ERR_STATE表中
c.ERR_error_string / ERR_error_string_n
根据错误码获取具体的错误信息,包括出错的库,出错的函数以及错误原因。
d.ERR_free_strings
根据错误号,获取出错的函数信息
e.ERR_get_err_state_table
获取存放错误的哈希表
f.ERR_get_error
获取存放错误的哈希表
g.ERR_get_error_line
根据错误号,获取出错信息
h.ERR_get_implementation
获取错误处理函数,与哈希表操作相关。
i.ERR_get_state
获取ERR_STATE表
j.ERR_lib_error_string
获取错误号,获取是那个库出错
k.ERR_load_strings
加载错误信息,由各个模块调用
l.ERR_load_ASN1_strings.
m.ERR_peek_error
获取第一个错误号
n.ERR_peek_error_line
获取第一个错误的出错行
o.ERR_peek_error_line_data
获取第一个错误的函数和错误信息
p.ERR_peek_last_error
获取最后一个错误的行号
q.ERR_peek_last_error_line_data
获取最后一个错误的行号和错误信息
r.ERR_print_errors
将错误信息输出到bio中
s.ERR_print_error_cb
根据用户设置的回调函数来打印错误信息
t.ERR_print_error_fp
将错误打印到FILE中
u.ERR_print_errors_fp
将错误信息存放到ERR_STATE表中top制定的错误堆栈
v.ERR_reason_error_string
根据错误号得到错误原因
w.ERR_remove_state
删除县城相关的错误信息
s.ERR_set_error_data
将错误信息存放到ERR_STATE表中top指定的错误堆栈(最后的错误)
y.ERR_unload_strings
从错误哈希表中删除相关信息
z.