首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

嵌入式 C 語言錯誤處理全攻略:從返回值到異常模擬

     編輯:關於C語言

錯誤分類

  • 嚴重性:致命性(無法恢復,只能記錄日誌並終止)vs 非致命性(多為暫時性,可延遲重試)。
  • 交互性:用戶錯誤(提示用戶操作失誤)vs 內部錯誤(供開發者調試,含敏感數據)。

錯誤處理五步驟

  1. 運行時發生錯誤(含硬件映射的軟件錯誤)。
  2. 生成錯誤指示符(整數、結構體等)記錄原因與上下文。
  3. 檢測錯誤(讀取指示符或回調上報)。
  4. 決策處理方式(忽略、部分處理、完全處理)。
  5. 恢復或終止執行。

主流錯誤傳遞機制

1. 返回值 + 回傳參數

最常用,但存在可讀性差、錯誤信息有限、成功/失敗定義不統一、調用者可忽略等問題。建議:Get 類函數用返回值攜帶結果,Set 類用返回值+回傳參數。統一定義狀態碼枚舉與解析宏。

2. 全局狀態標志 errno

Unix 系統調用與 C 庫函數失敗時設置 errno。注意:成功時可能修改 errno,必須先檢查返回值再讀 errno;多線程下為線程局部存儲;使用 strerror/perror 格式化輸出。可自定義類 errno 機制。

3. 局部跳轉 goto

破壞結構但適合集中錯誤處理。偽代碼模式:多個調用失敗統一 goto ErrHandle。

4. 非局部跳轉 setjmp/longjmp

跨函數跳轉,模擬異常機制。setjmp 保存棧環境,longjmp 恢復並返回非零值。注意:必須先調用 setjmp;longjmp 必須在 setjmp 作用域內;自動變量需加 volatile 保證一致性;大型項目不建議濫用,增加認知負擔。

5. 信號 signal/raise

處理除零等硬件異常。信號處理函數中可用 sigsetjmp/siglongjmp 跳過故障指令。整型除零不可恢復會循環觸發,需設置默認處理或跳轉。

程序終止與斷言

  • exit:正常終止,調用 atexit 登記函數,刷新 I/O 流。
  • _exit/_Exit:直接進入內核,不刷新流。
  • abort:發送 SIGABRT,異常終止。
  • assert:僅 Debug 生效,條件失敗輸出文件/行/函數/表達式並 abort。不可用於檢查合法的運行時錯誤(如文件不存在)。

封裝建議

  1. 封裝高頻系統調用(如 Fork),內部處理錯誤並退出。
  2. 封裝錯誤輸出(參考 err_doit/err_ret),支持變長參數、syslog、線程安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved