[問題] 純C下的異常處理
開發平台(Platform): (Ex: Win10, Linux, ...)
無
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
無
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
無
問題(Question):
因為工作上的限制,我目前都在純C下進行程式開發,編譯器可相容於C99。
最近錯誤處理的問題讓我十分在意,一直在想有沒有辦法可以處理得更好、更為簡潔
所以想向各位先進請益。另外這問題其實不算是C/C++專有的問題,但考量到各語言
有不同的語法、處理技巧,我尤其希望能得到C語言上的解答,所以貼在這個版,若
版主覺得不適合或還是覺得有違板規,我會再進行修正或刪除。
用個簡單的範例來說明,我設計一個程式,當使用者點下按鈕時,將系統目前的日期
時間透過通訊發送給遠端設備,我將程式拆分為三個部分:
業務邏輯層->協議處理層->硬體驅動層
業務邏輯處理一些程式運作的主流程:當使用者按下UI上的按鈕,會取得目前系統時
間,並呼叫協議處理層提供的發送函式(比方說SendTime(...))。
協議處理層負責將收到的時間轉換為特定的編碼方式,比方說將年、月、日、時、分
、秒各自轉換為長度1-byte的資料,並依序排列成一個陣列,接著呼叫硬體驅動層提
供的發送函式(比如說SendData(...))。
硬體驅動實際處理了將資料發送出去的底層行為,這部分大多是呼叫系統提供的底層
API,或是在沒有OS的情況下直接進行暫存器操作。
我的問題在於,假設這三層所提供的函式中,都會有失敗的風險,最常見到的處理方
式就是在每個函式都加個回傳值來確認執行結果,比方說成功傳True、失敗傳False,
或是成功傳0、失敗有個return code之類的。這裡產生幾個我覺得疑惑的地方:
1.每次呼叫函式時都要加個if檢查式,寫到後面發現檢查跟業務邏輯用的code數量幾
乎是1:1,閱讀code時總會覺得業務邏輯跟檢查邏輯混在一起有點難閱讀,請問這
只需要去適應就好,好是有更好的方式可以處理呢?
2.我在三個層失敗的時候都會留下log,可是每當發生錯誤時回去讀log總覺得很冗餘
,比方說一但有個硬體異常引起的錯誤,我會在log中依序看到硬體驅動層的錯誤訊
息、協議處理層的錯誤訊息、業務邏輯層的錯誤訊息。但其實仔細想想硬體驅動層
一但失敗其他兩個層根本不可能會成功,這增加除錯時閱讀的難度,而且實質上浪
費了系統資源(記憶體、儲存媒體空間之類的),請問這部分有更好的取捨方式嗎?
我不確定有沒有把自己疑惑的地方好好表達清楚,如果有語意不明的地方請讓我知道。
謝謝。
餵入的資料(Input):
無
預期的正確結果(Expected Output):
無
錯誤結果(Wrong Output):
無
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
無
補充說明(Supplement):
無
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.45.225.81 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1574612345.A.7A0.html
※ 編輯: icetofux (114.45.225.81 臺灣), 11/25/2019 00:19:42
推
11/25 00:51,
5年前
, 1F
11/25 00:51, 1F
→
11/25 00:53,
5年前
, 2F
11/25 00:53, 2F
→
11/25 00:54,
5年前
, 3F
11/25 00:54, 3F
→
11/25 00:56,
5年前
, 4F
11/25 00:56, 4F
→
11/25 00:56,
5年前
, 5F
11/25 00:56, 5F
推
11/25 01:03,
5年前
, 6F
11/25 01:03, 6F
→
11/25 01:03,
5年前
, 7F
11/25 01:03, 7F
→
11/25 01:03,
5年前
, 8F
11/25 01:03, 8F
推
11/25 02:08,
5年前
, 9F
11/25 02:08, 9F
推
11/25 08:44,
5年前
, 10F
11/25 08:44, 10F
推
11/25 09:35,
5年前
, 11F
11/25 09:35, 11F
→
11/25 10:10,
5年前
, 12F
11/25 10:10, 12F
推
11/25 11:07,
5年前
, 13F
11/25 11:07, 13F
→
11/25 11:08,
5年前
, 14F
11/25 11:08, 14F
→
11/25 11:09,
5年前
, 15F
11/25 11:09, 15F
→
11/25 11:09,
5年前
, 16F
11/25 11:09, 16F
→
11/25 11:09,
5年前
, 17F
11/25 11:09, 17F
→
11/25 11:11,
5年前
, 18F
11/25 11:11, 18F
→
11/25 11:11,
5年前
, 19F
11/25 11:11, 19F
→
11/25 11:13,
5年前
, 20F
11/25 11:13, 20F
推
11/25 15:46,
5年前
, 21F
11/25 15:46, 21F
推
11/25 18:21,
5年前
, 22F
11/25 18:21, 22F
→
11/25 18:29,
5年前
, 23F
11/25 18:29, 23F
推
11/26 10:31,
5年前
, 24F
11/26 10:31, 24F
推
11/26 14:27,
5年前
, 25F
11/26 14:27, 25F
推
11/28 20:44,
5年前
, 26F
11/28 20:44, 26F
→
11/28 20:44,
5年前
, 27F
11/28 20:44, 27F
→
11/28 20:45,
5年前
, 28F
11/28 20:45, 28F
推
12/01 14:12,
5年前
, 29F
12/01 14:12, 29F
→
12/01 14:12,
5年前
, 30F
12/01 14:12, 30F
→
12/01 14:12,
5年前
, 31F
12/01 14:12, 31F
→
12/01 14:13,
5年前
, 32F
12/01 14:13, 32F
推
12/02 15:24,
5年前
, 33F
12/02 15:24, 33F
→
12/02 15:24,
5年前
, 34F
12/02 15:24, 34F
→
12/02 15:24,
5年前
, 35F
12/02 15:24, 35F
推
12/05 17:10,
5年前
, 36F
12/05 17:10, 36F
討論串 (同標題文章)