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.
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM