C_and_CPP 板


LINE

開發平台(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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1574612345.A.7A0.html ※ 編輯: icetofux (114.45.225.81 臺灣), 11/25/2019 00:19:42
1F:推 Schottky: 這是個很值得探討的問題,但我這陣子暫時沒空回文細說 11/25 00:51
2F:→ Schottky: C 沒有 try-catch 因此錯誤處理確實要自己做不少事 11/25 00:53
3F:→ Schottky: 第一個問題可以用 macro 包裝固定的錯誤檢查程序 11/25 00:54
4F:→ Schottky: 第二個沒問題,其實出錯時你會想知道 call stack 11/25 00:56
5F:→ Schottky: 底層出錯時偶爾會想知道上層是哪隻豬居然這樣呼叫 11/25 00:56
6F:推 Schottky: 如果要集縮成一行也可以,就把錯誤訊息一路往上傳到最 11/25 01:03
7F:→ Schottky: 上層(你這邊是業務邏輯層)才寫log,每一層再各自加上自 11/25 01:03
8F:→ Schottky: 己的姓名和見解,就形成了一個完整的 call stack 11/25 01:03
9F:推 Ryspon: 好奇推 11/25 02:08
10F:推 CodingMan: 我也想知道 11/25 08:44
11F:推 chuegou: 關注 11/25 09:35
12F:→ F04E: 我自己實務上也是採用Schottky的作法 11/25 10:10
13F:推 flysonics: 和Schottky相似+1 11/25 11:07
14F:→ flysonics: 不過我的習慣是寫一個handler去接所有檢查邏輯fail的情 11/25 11:08
15F:→ flysonics: 況 這樣順帶可以從handler function下列清單 一目了然 11/25 11:09
16F:→ flysonics: 看到自己埋了哪些檢查點 11/25 11:09
17F:→ flysonics: log的部分 我是會整個Task全部用一個structure去管 11/25 11:09
18F:→ flysonics: 萬一底層發生問題時 只要直接將必要資訊記在structure 11/25 11:11
19F:→ flysonics: 上 到最上層時再assert卡下來 11/25 11:11
20F:→ flysonics: 沒有try&catch 就自己兜個堪用的方便debug的概念 11/25 11:13
21F:推 Qbsuran: wireshark有實作出try-catch(純C) 可以看看source 11/25 15:46
22F:推 eye5002003: 我很懶惰,所以都是抓__FILE__跟__LINE__噴一下位置 11/25 18:21
23F:→ eye5002003: 出問題的時候才來認真嵌訊息調查 11/25 18:29
24F:推 alan23273850: 我怎麼記得c++有支援try-catch 11/26 10:31
25F:推 ko27tye: c++有阿 標題問的是C 11/26 14:27
26F:推 x246libra: go的錯誤處理跟C有點像似 要參考一下嗎 11/28 20:44
27F:→ x246libra: https://juejin.im/post/5d772620e51d4561c83e7cd2 11/28 20:44
28F:→ x246libra: 跳到 Opaque errors 來看 11/28 20:45
29F:推 exeex: 做起來應該跟golang有87%像 12/01 14:12
30F:→ exeex: 不過golang可以return兩個以上的變數包含err, C要另外想辦 12/01 14:12
31F:→ exeex: 法 12/01 14:12
32F:→ exeex: 用macro把return包住是一個方法 12/01 14:13
33F:推 flysonics: 用macro把return包住 這樣會讓後面讀code的人困擾吧.. 12/02 15:24
34F:→ flysonics: . 12/02 15:24
35F:→ flysonics: 你包了個一格洞在裡面誰知道 12/02 15:24
36F:推 dou0228: wireshark exception + zlog, 不要用 __FILE__ 12/05 17:10







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP