函数返回设计以及错误处理

本文属spanzhang(张友邦)原创,发布地址为:http://blog.csdn.net/spanzhang。转载请注明原文出处,否则我就死给你看。

今天在闲逛的时候发现一篇文章,zhuweisky写的《函数设计之美--函数需要返回错误码吗(一)?》(http://blog.csdn.net/zhuweisky/archive/2005/09/08/475355.aspx)。文章主要对函数返回错误码一事进行了讨论,作者最后给出的观点是采用契约式的前置约束而不是返回错误码来使得设计变得更加优雅。

我对这个问题也关心很久了,一直没来得及整理思路。应该说这是一个非常普遍的设计问题,很多人都在这个问题前犯过难。我觉得对于函数返回值的设计以及错误处理应该和团队习惯以及开发工具有很大关系,个人不推荐契约式的前置约束。我对契约式设计没有深入地研究过,但可以想象,运行时的契约检查如果不成立同样也会涉及到错误处理(有可能是抛出异常),所以荐契约式的前置约束实际上是换汤不换药。但我在zhuweisky的文章中看到的代码没有在函数前置约束的Meta Data中指定契约不满足时的处理办法,语言级的支持没办法在编译的时候提供任何运行时保证。

对于C++开发语言,我个人推荐采用返回值的方式来表达运行结果情况而用out参数(指针或引用)承载实际内容。对简单的情况,返回值可以是bool类型,但更多的时候推荐使用枚举(或int)。任何函数在执行之初对传入参数和运行环境的基本检查是必需的,这是一个非常好的习惯。之所以我这样认为,是因为C/C++的历史原因导致。而对于Java来说就更多的推荐使用异常机制来处理错误和约束。但函数约束检查都是必须的,它能在局部保证函数的正常运行。

zhuweisky在文中提到的一句话我非常赞同:不要让错误传播(出现),在错误出现的发源地(萌芽期)就解决它!错误越是传播到最后,关于处理它的上下文就丢失得越多,对于错误的蔓延就越是爱莫能助!这也正是约束检查的证据,同时结合分层的设计让错误呈现出层次结构,对每一层的错误处理都是必需的。

以上观点纯属个人见解,如有不同意见,欢迎来信:[email protected]

你可能感兴趣的:(C++,c,.net,C#,Gmail)