一 錯誤概念
1.1 錯誤分類
從嚴重性而言,程式錯誤可分為致命性和非致命性兩類。對於致命性錯誤,無法執行恢復動作,最多只能在使用者螢幕上列印出錯訊息或將其寫入日誌檔案,然後終止程式;而對於非致命性錯誤,多數本質上是暫時的(如資源短缺),一般恢復動作是延遲一些時間後再次嘗試。
從互動性而言,程式錯誤可分為使用者錯誤和內部錯誤兩類。使用者錯誤呈現給使用者,通常指明使用者操作上的錯誤;而程式內部錯誤呈現給程式設計師(可能攜帶使用者不可接觸的資料細節),用於查錯和排障。
應用程式開發者可決定恢復哪些錯誤以及如何恢復。例如,若磁碟已滿,可考慮刪除非必需或已過期的資料;若網路連線失敗,可考慮短時間延遲後重建連線。選擇合理的錯誤恢復策略,可避免應用程式的異常終止,從而改善其健壯性。
1.2 處理步驟
錯誤處理即處理程式執行時出現的任何意外或異常情況。典型的錯誤處理包含五個步驟:
1) 程式執行時發生軟體錯誤。該錯誤可能產生於被底層驅動或核心對映為軟體錯誤的硬體響應事件(如除零)。
2) 以乙個錯誤指示符(如整數或結構體)記錄錯誤的原因及相關資訊。
3) 程式檢測該錯誤(讀取錯誤指示符,或由其主動上報);
4) 程式決定如何處理錯誤(忽略、部分處理或完全處理);
5) 恢復或終止程式的執行。
二 錯誤傳遞
2.1 返回值和回傳引數
c語言通常使用返回值來標誌函式是否執行成功,呼叫者通過if等語句檢查該返回值以判斷函式執**況。
1) **可讀性降低
沒有返回值的函式是不可靠的。但若每個函式都具有返回值,為保持程式健壯性,就必須對每個函式進行正確性驗證,即呼叫時檢查其返回值。這樣,**中很大一部分可能花費在錯誤處理上,且排錯**和正常流程**攪在一起,比較混亂。
2) 質量降級
條件語句相比其他型別的語句潛藏更多的錯誤。不必要的條件語句會增加排障和白盒測試的工作量。
3) 資訊有限
通過返回值只能返回乙個值,因此一般只能簡單地標誌成功或失敗,而無法作為獲知具體錯誤資訊的手段。
4) 定義衝突
不同函式在成功和失敗時返回值的取值規則可能不同。例如,unix系統呼叫級函式返回0代表成功,-1代表失敗;新的posix函式返回0代表成功,非0代表失敗;標準c庫中is***函式返回1表示成功,0表示失敗。
5) 無約束性
呼叫者可以忽略和丟棄返回值。未檢查和處理返回值時,程式仍然能夠執行,但結果不可預知。
新的posix函式返回值只攜帶狀態和異常資訊,並通過引數列表中的指標回傳有用的結果。 回傳引數繫結到相應的實參上,因此呼叫者不可能完全忽略它們。通過回傳引數(如結構體指標)可返回多個值,也可攜帶更多的資訊。
2.2 全域性狀態標誌(errno)
unix系統呼叫或某些c標準庫函式出錯時,通常返回乙個負值,並設定全域性整型變數errno為乙個含有錯誤資訊的值。例如,open函式出錯時返回-1,並設定errno為eacess(許可權不足)等值。
c標準庫標頭檔案中定義errno及其可能的非零常量取值(以字元』e』開頭)。在ansi c中已定義一些基本的errno常量,作業系統也會擴充套件一部分(但其對錯誤描述仍顯匱乏)。linux系統中,出錯常量在errno(3)手冊頁中列出,可通過man 3 errno命令檢視。除eagain和ewouldblock取值相同外,posix.1指定的所有出錯編號取值均不同。
使用errno時應注意以下幾點:
1) 函式返回成功時,允許其修改errno。
例如,呼叫fopen函式新建檔案時,內部可能會呼叫其他庫函式檢測是否存在同名檔案。而用於檢測檔案的庫函式在檔案不存在時,可能會失敗並設定errno。這樣, fopen函式每次新建乙個事先並不存在的檔案時,即使沒有任何程式錯誤發生(fopen本身成功返回),errno也仍然可能被設定。
2) 庫函式返回失敗時,不一定會設定errno,取決於具體的庫函式。
3) errno在程式開始時設定為0,任何庫函式都不會將errno再次清零。
因此,在呼叫可能設定errno的執行庫函式之前,最好先將errno設定為0。呼叫失敗後再檢查errno的值。
4) 使用errno前,應避免呼叫其他可能設定errno的庫函式
最後分享交流裙,大家可以一起學習經驗:371783246
c語言程式設計基礎
提公升c程式設計能力
九天學會linuxc語言
嵌入式系統高階C語言程式設計
內容介紹 本書主要介紹針對嵌入式系統基於c語言的軟體專案開發流程 較為複雜的c語言程式設計知識與技巧 程式設計風格及除錯習慣,並通過對乙個具體的軟體模組 asix window gui 的分析,介紹分析 的方法以及設計軟體系統需要考慮的各要素。本書以實際專案中的 為例來進行介紹,詳細分析在嵌入式系統...
嵌入式學習(二) 嵌入式系統C 語言
1 從 cpu 復位時的指定位址開始執行 2 跳轉至彙編 startup 處執行 3 跳轉至使用者主程式 main 執行,在 main 中完成 a.初試化各硬體裝置 b.初始化各軟體模組 c.進入死迴圈 無限迴圈 d呼叫各模組的處理函式 下面是幾個 著名 的死迴圈 1 作業系統是死迴圈 2 win3...
嵌入式C程式設計小結
最近在看公司嵌入式開發的文件和c語言 真佩服那些設計的人員,從需求分析說明書 時序圖 概要設計 詳細設計 到code階段,都做得很細緻。而且純粹是c語言開發,軟體設計人員必須對硬體有很深的了解才行,我看了一下裡面的code,足足有幾百多個.h和.c檔案,各個模組寫得很細緻。專案都快接近尾聲了,我什麼...