GNU程式設計錯誤出理

2021-04-08 21:45:25 字數 3068 閱讀 1110

錯誤報告

(error reporting)

這一節將要說明錯誤報告機制是如何工作的。如果你的程式要用此功能,必須包含標頭檔案

」errno.h」

檢測錯誤

大多數庫函式返回乙個特殊的值來指示它們執行中的錯誤。這個特殊的值一般是

-1、空指標(

null

)、或者像

eof等有明確定義意義的常值。但是這些返回值只是告訴你有乙個錯誤發生,為了找出是什麼錯誤發生,這時就需要檢視在變數

errno

中的值。變數

errno

定義在標頭檔案

」errno.h」中。

變數:volatile int errno

變數

errno

包含了系統錯誤的代號,你可以修改這個變數的值。 因為

errno

定義時加了修飾

volatile

,所以可以乙個訊號處理中非同步修改此值。

在程式啟動時,

errno

初始化為

0。大多數庫函式在當遇到錯誤時,都會設定

errno

為某個非零值。對於每個函式都會列出全部錯誤的條件。當這些函式呼叫成功時,

errno

的值將不會改變

。因此,當成功呼叫後,

errno

的值不必是

0,你也不能以

errno

去判斷乙個函式呼叫是否成功。正確的方法是按第每個函式的說明文件來判斷。如果呼叫失敗了,你可以檢查

errno。

大多數庫函式在呼叫其它庫函式時,如果出現錯誤,則會將

errno

設定為乙個非零值。當函式返回錯誤時,我們可以假設這個函式已變數了

errno

的值。

也存在極少數的函式,如

sqrt

、atan

,在發生錯誤時,也返回乙個合法的值,同時也會修改

errno

的值。對於這樣的函式,你如何判斷是否有錯誤發生呢。推薦的方法是,在呼叫函式之前,設定

errno

為零,然後在呼叫後再來檢測

errno

的值,如何發生了改變,則說明呼叫函式出錯。

所有的錯誤代號都有乙個符號名,這些巨集都在

」errno.h」

中定義。這些巨集定義名都以

e和乙個大寫字母或數字開頭。

所有這個錯誤代號都是正整數,並且都是互不相同的。因此,你的程式中可以用

switch

語句。

errno

的值沒有必要與所有這引巨集定義對應。因為有些庫函式為了一些別的情況,返回了別的錯誤代號。

相關的錯誤**及說明請檢視

gcc library

的說明

錯誤資訊

函式庫已經設計了一些函式和變數,當呼叫庫函式發生錯誤時,來幫助我們程式以通用的格式報告錯誤資訊。函式

strerror

和perror

對每個給定的錯誤代號返回標準的錯誤資訊。通過變數

program_invocation_short_name

你可以方便的得到遇到錯誤的程式名稱。 函式

char*strerror (interrnum)

定義在標頭檔案

」string.h」中

通過由errnum

指定的錯誤代號返回錯誤的描敘字串。

注意:如果你併發的呼叫

strerror

,返回的字串可能被重寫。 函式

char*strerror_r(interrnum, char buf ,size_t n)

定義在標頭檔案

」string.h」中

函式strerror_r

的工作方式與

strerror

樣同,但替代

strerror

所有執行緒共享靜態緩衝區儲存錯誤資訊的方式為將錯誤資訊儲存在使用者提供的以

buf開頭,長為

n個位元組的緩衝區裡。

緩衝區最大可寫

n個位元組(包括

null),

所以必須保證緩衝區夠大。

這個函式將用於多執行緒的程式。因為

strerror

函式不能保證由函式

strerror

返回的資訊真的屬於當前執行緒最後一次呼叫。 函式

void perror ( const char * message)

定義在標頭檔案

」stdio.h」中

此函式在

stderr

流中列印錯誤資訊。

如果引數

message

是乙個空指標或空字串時,

perror

就僅在新一行列印與

errno

對應的錯誤資訊字串。

如果引數

message

不是乙個空的字串時,

perror

將以message

作為字首,和錯誤資訊輸出。在

message

和與errno

對應的錯誤資訊字串之間插入了冒號和空格。

變數:

char*program_invocation_name

變數:

char*program_invocation_short_name

定義在

errno.h

檔案中

program_invocation_name

是檔名,包括路徑,等同於

argv[0]。

program_invocation_short_name

是程式名,不包括路徑。

注意這兩個變數屬於

gnu擴充套件,需要使用此兩個變數,則要在使用源程式的開始定義巨集變數

_gnu_source

如程式:

#define _gnu_source

#include

#include

#include

#include

int main(int agrc,char* argv)

return 0;

}

404錯誤 405錯誤 500錯誤出錯原因

是伺服器執行完客戶端的請求以後,返回給客戶端的乙個執行結果的狀態編碼。產生原因 web伺服器 容器 根據請求的位址找不到相應資源。如 1 位址錯誤 拼寫不正確,字母大小寫錯誤 2 web.xml檔案中的兩個不一致 3 工程沒有部署 4 web應用程式部署結構沒有遵守servlet規範 產生原因 we...

WEB程式目錄配置有誤出現錯誤

在發布web應用程式時,出現js 等jsp以外的檔案找不到的錯誤 404 百思不得其解。檢視了web工程中的各項配置,都沒有錯誤。於是,重新考慮一下web下的目錄結構,終於發現了。我把js和images都放到web inf下了。因為web inf下的東西只能通過action進行訪問,像js和imag...

python常見錯誤歸理

4 invalid syntax報錯 python版本不同,格式要求不一樣 引數符號漏寫,錯寫 5 launching new configuration 右鍵project properties run debug settings 1.select launching new configura...