开发平台(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):
无