Linux系統程式設計師的錯誤處理

2021-07-04 19:40:36 字數 3175 閱讀 5852

程式設計師的錯誤處理

要把正確的搞定,也要把錯誤的搞定,還要防止別人有意無意的破壞;

主流的程式語言(除了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 中 錯誤處理包含三個等級,方法級,頁面級,程式級,如果當前等級沒有處理好...