程式設計師的錯誤處理
要把正確的搞定,也要把錯誤的搞定,還要防止別人有意無意的破壞;
主流的程式語言(除了c語言外)基本都使用異常機制處理錯誤,c語言中沒有異常機制;
c程式設計師是用返回值代表是否出錯,主要有以下4種情況:
1.如果返回型別是 int(如主函式/隨機數等),並且返回值不可能是負數,正常資料會直接返回,用返回-1代表出錯(如返回陣列下標》=0);
2.如果返回型別是 int,並且返回值有可能是負數(如返回兩個負數中的大者),此時正常資料用指標返回,返回-1代表出錯,0代表正確;
3.如果返回型別是指標,返回 null 代表出錯,其他代表正常;
4.如果函式不需要考慮出錯問題,用 void 型函式,無返回值;
注意以上4種情況只是經驗之談,大多如此;但不是絕對的;
如有時返回指標不用null而用-1表示出錯((void*)-1))也是可以的;
乙個函式影響外部資料的方式有2種:
1.用 return 語句返回;
2.引數中傳遞指標形式,也可以影響外部資料;
練習有4個函式
a返回兩個數的最大值,如果這兩個數相等,返回錯誤;
/* 資料用指標傳遞,情況2 */
b返回0-10的隨機數,如果隨機數為0則函式返回錯誤;
/* 可以用-1表示出錯,情況1 */
c傳入乙個字串,如果傳入的是"error",返回錯誤;否則返回原來函式的字串;
/* 返回指標,情況3; */
d列印乙個傳入的字串;
/* 不需要返回值,也無須考慮錯誤,情況4; */
/*
* 錯誤處理演示
*/#include #include #include #include /* 情況1,正常值非負,用-1表示出錯 */
int ran10()
return ra;
//返回-1代表出錯,資料正常返回;
}/* 情況2,正常值也有負數,返回0表示正常,資料用指標處理傳遞 */
int max(int num1, int num2, int *pi)
*pi = (num1 > num2) ? num1 : num2;
return 0;
//0代表沒有出錯,資料存在*pi中
}/* 情況3,返回值是指標型別,返回null代表出錯,其他值直接帶回 */
char *iserror(char *str)
return str;
//返回指標
}/* 情況4,不需要考慮出錯問題,用void型函式; */
void print(char *str)
int main() else
r = ran10();
if (r == -1) else
char *s = iserror("ok");
if (s == null) else
print(s);
return 0;
}
c語言用外部的全域性變數errno(error number)記錄錯誤資訊;
錯誤資訊包括錯誤編號(int)和具體資訊(字串);
每個錯誤編號都對應乙個具體資訊;
errno儲存的是錯誤編號;
函式strerror()/perror()/printf()用於錯誤資訊的顯示和轉換;
char *strerror(int errnum) 傳入乙個編號,返回具體資訊(轉換函式);
void perror(const char *s) 不用傳入錯誤編號,直接列印errno對應的資訊(會自動換行);
printf("%m") 直接列印errno對應的資訊;
不是所有的函式都使用errno處理錯誤,比如執行緒的函式;
注意安裝翻譯軟體星際譯王或goldendict
man命令可以檢視命令/函式和標頭檔案等的幫助資訊;
如果man命令顯示的不是英文,可以首先執行,export lang="en";
在linux中獲取指令的幫助資訊
man string.h
使用空格或page down翻頁,也可使用上下鍵滾屏
q退出man 3 printf //檢視c庫函式
3表示的是man查詢幫助的**,可分為以下8種;
首先要檢視概述,尤其注意其中的標頭檔案和函式原型,引數型別,返回值型別;
然後檢視描述資訊,可以簡要了解函式的功能;
最後還要看函式的返回值的意義;
man find
查詢系統命令的幫助資訊;
首先看name,了解命令的基本功能;
然後看概述,了解命令的使用形式;
然後再看描述,了解其具體功能;
然後還要看選項資訊,了解各選項的意義;
如果可能還可以看一些使用範例;
不需要記住幫助資訊,只需要明白使用的有價值的資訊即可,用的多的自然就會記住常用的;
man man
the standard sections of the manual include
1 user commands //使用者命令
2 system calls //系統命令
3 c library functions //c庫函式
4 devices and special files //裝置和特設檔案
5 file formats and conventions //檔案格式與轉換
6 games et. al. //遊戲等
7 miscellanea //雜集
8 system administration tools and deamons //系統管理工具
man strerror
errno只有在出錯時才會改變值,不出錯也不會恢復值;
因此errno只能說明出過什麼錯,而不能據此判斷當前步驟是否出錯;
若判斷是否出錯要使用函式的返回值;
確定出錯以後再使用errno判斷出了什麼錯
/*
* perror()使用示例
*/#include #include #include int main() else
file = null; //如果確保file不再使用可以省略;
return 0;
}
MySql錯誤處理 錯誤處理的例子
有幾種錯誤處理的宣告形式 如果任何錯誤 不是 not found 設定 l error 為 1 後繼續執行 declare continue handler for sqlexception set l error 1 如果發生任何錯誤 不是 not found 執行 rollback和產生一條錯誤...
Linux系統程式設計錯誤處理函式
作為linux的菜鳥,最近在看 linux uinx系統程式設計手冊 不得不說這是本很好很好的書。今天整理了一下在本書上冊開始部分給出的錯誤處理函式如下,希望對大家有所幫助 tlpi hdr.h ifndef tpli hdr h define tpli hdr h prevent accident...
錯誤處理和程式優化
1,異常處理 異常處理方式 1,使用驗證控制項 2,程式設計處理 校驗語句 try catch finally page error 3,應用程式配置檔案中指定錯誤頁面 4,checked.將容易出現錯誤的 放到checked 中 錯誤處理包含三個等級,方法級,頁面級,程式級,如果當前等級沒有處理好...