`
izuoyan
  • 浏览: 8882825 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

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

以上观点纯属个人见解,如有不同意见,欢迎来信:spanzhang@gmail.com

分享到:
评论

相关推荐

    计算机应用基础Excel公式与函数微课程设计方案.docx

    《计算机应用基础》微课程设计方案 姓 名 所教学科 电子邮件 单位名称 主题名称 选题意图 内容来源 适用对象 教学目标 作者信息 联系电话 所教学段 微课程信息 Excel 公式与函数 (请在此处说明为什么选择这个主题来...

    精通WindowsAPI 函数 接口 编程实例

    9.2.3 消息和消息处理函数 247 9.2.4 控件 247 9.2.5 资源 248 9.2.6 对话框 248 9.3 图形用户界面:窗口 248 9.3.1 注册窗口类 249 9.3.2 创建窗口 251 9.3.3 窗口消息处理函数 253 9.3.4 窗口...

    C语言程序设计标准教程

     此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。 3...

    精通Windows.API-函数、接口、编程实例.pdf

    9.2.3 消息和消息处理函数 247 9.2.4 控件 247 9.2.5 资源 248 9.2.6 对话框 248 9.3 图形用户界面:窗口 248 9.3.1 注册窗口类 249 9.3.2 创建窗口 251 9.3.3 窗口消息处理函数 253 9.3.4 窗口...

    Django框架视图函数设计示例

    一般情况下,视图函数的功能是通过模型层对象处理数据,然后通过下面三种方式返回HTTP Response: 直接构造HTTP BODY 用数据渲染HTML模板文件 如果有逻辑错误就返回HTTP错误或者其他状态! 1.直接构造HTML页面 ...

    程序设计方法.[美]Matthias Felleisen(带书签文字版).pdf

    6.5 设计处理复合数据的函数 53 6.6 补充练习: 圆和长方形的移动 57 6.7 补充练习:刽子手游戏 61 第7章 数据的多样性 62 7.1 数据混合与区分 63 7.2 设计处理混合数据的函数 66 7.3 再论函数复合 69 7.4 ...

    C程序设计 第四版 谭浩强 高清扫描版 带完整书签目录 加 学习辅导

    包括C程序设计(第四版)的高清扫描版pdf以及与该书配套的学习辅导一书的pdf。 《C程序设计(第四版)》是由谭浩强教授著、清华大学出版社出版的《C程序设计》是一本公认的学习C语言程序设计的经典教材。根据C语言的...

    程序设计方法(How_To_Design_Programs)-MIT.pdf

    6.5 设计处理复合数据的函数 43 6.6 补充练习:圆和长方形的移动 46 6.7 补充练习:刽子手游戏 49 第7章 数据的多样性 52 7.1 数据混合与区分 52 7.2 设计处理混合数据的函数 55 7.3 再论函数复合 58 7.4 补充练习:...

    Excel 2010函数应用速查手册

    前言 第1章 文本函数 1.1 LOWER 1.2 TEXT 1.3 CHAR 1.4 RMB 1.5 LEFT 1.6 LEFTB 1.7 RIGHT 1.8 SEARCH 1.9 SEARCHB 1.10 UPPER 1.11 PROPER 1.12 CODE 1.13 DOLLAR 1.14 CONCATENATE 1.15 TRIM 1.16 ASC 1.17 ...

    C程序设计语言(第2版·新版)

    7.6 错误处理—stderr和exit函数 7.7 行输入输出 7.8 其他函数 7.8.1 字符串处理函数 7.8.2 字符类测试和转换函数 7.8.3 ungetc函数 7.8.4 命令执行函数 7.8.5 存储管理函数 7.8.6 数学函数 7.8.7 随机数...

    C程序设计语言_第2版(带书签目录)

    7.6 错误处理——stderr和exit 7.7 行输入和行输出 7.8 其他函数 第八章 UNIX系统接口 8.1 文件描述符 8.2 低级I/O——read和write 8.3 open、create、close和unlink 8.4 随机访问——lseek 8.5 实例——...

    失败:专门为Web应用程序服务器设计的更好的错误处理解决方案

    失败 更好的错误处理解决方案,尤其是对于应用程序服务器。 fail为错误提供了上下文元数据。 堆栈跟踪错误代码(表示HTTP / gRPC状态代码) 可报告性(与错误报告服务集成) 附加信息(标签和参数)为什么由于Golang...

    C程序设计语言 很适合初学者和再学者学习和复习

    7.6 错误处理—stderr和exit函数 7.7 行输入输出 7.8 其他函数 7.8.1 字符串处理函数 7.8.2 字符类测试和转换函数 7.8.3 ungetc函数 7.8.4 命令执行函数 7.8.5 存储管理函数 7.8.6 数学函数 7.8.7 随机数...

    c语言设计Brian W. Kernighan Dennis M. Ritchie

    7.6 错误处理—stderr和exit函数 7.7 行输入输出 7.8 其他函数 7.8.1 字符串处理函数 7.8.2 字符类测试和转换函数 7.8.3 ungetc函数 7.8.4 命令执行函数 7.8.5 存储管理函数 7.8.6 数学函数 7.8.7 随机数...

    C程序设计(第四版)学习辅导【谭浩强】

    8.6返回指针值的函数276 8.7指针数组和多重指针279 8.7.1什么是指针数组 279 8.7.2指向指针数据的指针282 8.7.3指针数组作main函数的形参284 8.8动态内存分配与指向它的指针变量287 8.8.1什么是内存的动态分配287 ...

    VC++6.0核心编程源码.rar

    在我们开始介绍Microsoft Windows应该提供的许多特性之前,我们首先必须了解Windows的各个函数是如何进行错误处理的。 当你调用一个Windows函数时,它首先要检验你传递给它的的各个参数的有效性,然后再设法执行它的...

    c语言图书管理系统课程设计报告(1).doc

    调用时将链表头指针传递给函数,函数返回经过功能操作后的头指针 。 3.结构体系设计: 以下为部分流程图: 图书管理系统主界面流程图 管理员版图书管理系统流程图 图书查询系统主界面流程图 排序页面 5.设计过程中...

    C++课程设计报告银行账户管理系统.doc

    要求具有一定的安全机制,如用户在一定的时间范围内对系统 未予以响应,或者用户多次输入错误的登录信息时,系统会自动给用户发出提示性信息 ,以便用户处理解决问题。 用户界面要求:输入:程序正常运行后,屏幕上...

    Excel_VBA程序设计.pdf

    第十节 其他类语句和错误语句处理 4 第十一节 过程和函数 5 一.Sub过程 5 二.Function函数 5 三.Property属性过程和Event事件过程 5 第十二节内部函数 6 一.测试函数 6 二.数学函数 6 三.字符串函数 6 四....

Global site tag (gtag.js) - Google Analytics