【编程好习惯】判断函数的返回值

2023-05-16

调用一个函数后要检查函数的返回值,以决定程序是继续应用逻辑处理还是出错处理,这理应是一个常识,但在现实中,却存在大量不检查函数返回值的代码。既然是常识,但却得不到重视,这不能简单地说程序员不知道其危害性。相信读者也明白不检查函数的返回值其危害是什么,因此,也不打算举例说明其所带来的问题,而是试图去探究程序员为什么不按这一常识去做。

要判断函数的返回值,不可避免地要面对一个问题 —— 出错了怎么办?这显然不是一个简单的问题,在这问题的背后可能是在问:在项目中一个错误如何表达?项目是否定义了出错处理的准则或机制?

如果一个项目没有一种有效的方法表达一个错误,那么就会出现对于出错处理的混乱状况。当出现错误时,仅仅通过C库中已经定义了的那么几个错误码并不能有效地表达应用错误。之所以需要有效地表达各类错误,是因为针对不同的错误可能需要采用完全不同的出错处理方法。不同的错误可能收敛于几个错误类别,但还是存在一定程序的发散性。没有有效的方法去定义一个错误,势必会造成程序员在面对函数返回错误时需要进行大量的思考,其所带来的个人思考成本还是很高的,进而程序员干脆就不去考虑它。在《错误管理》一文中介绍了一种通过定义错误码表达错误的方法,项目中这种类似方法的存在,能大大地降低程序员个体在面对函数返回错误时的思考成本。从程序员的角度来说,如果项目没有一种明确的错误表达方式,且即使按其个人的想法进行错误处理也最终会进入一种混乱状态,也就是说考虑与否可能结局都是一样的,只是从一种混乱形式变成了另一种,这应当是程序干脆不进行出错处理的一个重要原因。

一个项目光定义好了一种通用的方法去表达一个错误就好了吗?为了进一步说明问题,需要借助一定的项目实际来帮助继续分析。假设一个电信产品是进行电话呼叫处理的,在这个产品中的呼叫处理模块对于每一个用户电话连接的建立,都需要从DSP处理器上获取一个DSP通道(读者可以想到会有一个DSP通道管理模块存在于系统中)以对电话语音数据进行编解码工作,那么当DSP通道被用尽了以后呼叫处理模块该怎么办?显然,这里DSP通道用尽就是一种错误,如果这个错误被定义成了一个错误码ERROR_CP_NOCHANNEL,那进一步的问题是,这一错误出现时,呼叫出理模块应当采取怎样的处理呢?可能的做法有:
1) 由于系统有一定的用户容量限制,DSP通道的用尽意味着用户数量超过了系统所能处理的最大用户数,因此,这种情形下即使出现了ERROR_CP_NOCHANNEL错误,也只需记录一个错误日志,并结束对这一用户的后续呼叫处理逻辑。或许,ERROR_CP_NOCHANNEL的出现严格地说不是错误。
2) 虽然系统有最大用户数的限制,但通过程序中的统计变量可以确定,当前的用户数根本没有超过最大用户数。因此,ERROR_CP_NOCHANNEL错误的出现意味着系统有严重的资源泄漏,从而造成DSP通道不足,这次是真正的错误了。如果是这样又有两种出错处理方法。其一是直接对产品进行复位,如此一来,就解决了资源的泄漏问题,但其缺点也是明显的,即在复位时,本来正在通话的用户将会出现掉话的问题。其二,只是记录一个错误日志,然后终止对这一用户的后续处理,也不进行产品复位操作以保证当前正接通的用户能继续进行通话,系统的资源泄漏也不管,直到系统资源泄漏到不能提供任何一个服务为止再复位。

从ERROR_CP_NOCHANNEL错误的可能处理来看,不是仅有错误码的定义就完事了,而是需要从应用的层面定义好每种(不一定是每个)错误出现时的处理逻辑是什么。这里所例举的呼叫处理错误,其实在一个产品中的任一个模块都可能存在相类似的问题,只是形式变了。而面对一个错误,其具体的应对方法往往需要考虑很多因素,有时面对的有可能是两难问题。如果一个项目没有定义好各类错误的大致处理思路,而是完全由程序员自己去思考,那还是会导致程序员的个体思考成本过高这一问题,而且没有统一出错处理思路的指导,不同程序员所做出来的出错处理方法有可能就会是相悖的,其结果就是另一种混乱局面出现了!另外,即使定义了项目的出错处理思路,那这些出错逻辑是放在哪里处理呢?是将其分散在程序的各模块呢?还是集中处理?如果是分散处理则有可能出现大量的冗余代码,且可能存在一定的困难。因为有些错误的处理,需要得到很多其它的信息,如果分散在程序的各处,那么意味着这些信息需要很大程度的公开,这会造成程序的结构出现一定的退化。笔者的观点是,究竟采用分散还是集中处理方式并没有绝对,但应当以集中出错处理为主。在后面笔者将会写一篇文章志门阐述出错处理方法,到时读者可以看到更为深入的一些内容。


至此,程序员不按常识进行函数返回值的判断的深层次原因分析过了,那要解决这一问题显然不能通过将“判断函数返回值”这几个字通过使用初号字体打印出来并贴在程序员的办公桌显眼处这一方式加以解决。出错处理其实不是程序员的个人私事,而是项目的集体事。要根本解决它,应当从项目全局的角度去着手。以下几点项目组可以考虑去做:
1) 从项目的层面定义好一个错误的表达方式是什么。通常,在C程序中需要定义错误码,而在C++中需要定义异常,当然在错误管理》一文中也介绍了可以通过将两者结合起来做以简化错误表达。
2) 从项目的层面定义好各大类错误的处理思路和方法。另外,在项目团队中还要打造一种探讨出错处理思路和方法的氛围,这样更容易在团队中集思广义形成共识,从而为这些方法的实施铺平道路。
3) 在设计层面提供一定的错误处理机制以帮助减少程序出错时的代码工作量,这能有效的促进程序员积极面对函数的错误返回值。

无论如何,要形成一种勇于面对函数出错和积极思考出错处理方法的文化对于项目团队来说不是一件容易事,但却非常重要。另外,有这方面的意识比没有要好,重视比不重视要好,当然做比不做又要更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【编程好习惯】判断函数的返回值 的相关文章

  • Xgboost 模型保存和载入()

    https blog csdn net u012884015 article details 78653178 xgb model get booster save model 39 xgb model 39 tar 61 xgb Boos
  • 新版福昕阅读器(Foxit Reader)启动速度慢解决办法

    新版福昕阅读器 xff08 FoxitReader xff09 启动速度慢解决办法之前喜欢使用福昕阅读器的原因就是看中了其小巧 xff0c 可是最近版本的阅读器打开速度变得慢了很多 xff08 不是电脑配置问题 xff09 xff0c 比A
  • 漫谈 SLAM 技术(上)

    欢迎大家前往腾讯云社区 xff0c 获取更多腾讯海量技术实践干货哦 作者 xff1a 解洪文 导语 随着最近几年机器人 无人机 无人驾驶 VR AR的火爆 xff0c SLAM技术也为大家熟知 xff0c 被认为是这些领域的关键技术之一 本
  • 【设计模式】我终于读懂了命令模式。。。

    文章目录 x1f436 智能生活项目需求 x1f42d 命令模式基本介绍 x1f439 命令模式的原理类图 x1f430 对原理类图的说明 即 命名模式的角色及职责 x1f43a 命令模式解决智能生活项目 x1f438 下面我们跟着代码de
  • css制作从下往上逐渐显示的div

    html代码 span class hljs tag lt span class hljs name div span span class hljs attr class span 61 span class hljs string 34
  • 清除redis缓存的命令,redis常用命令

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 清除redis缓存的命令 xff0c redis常用命令 Redis 命令 xff1a flushall gt 清空整个 Redis 服务器的数据 删除所有数据库的所有 k
  • R语言做正态分布检验

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 首先准备两个样本 code set seed 0 a lt runif 100 min 61 3 max 61 3 b lt rnorm 100 mean 61 0 sd
  • node-gyp安装 报错if not defined npm_config_node_gyp

    解决if not defined npm config node gyp 1 br npm install g node gyp 2 npm config set node gyp 34 node C Users me AppData Ro
  • Oracle在Windows上的运行问题分析和解决

    Oracle大型数据库系统在AIX UNIX上的实战详解 集中讨论的继续 做了一周关于Oracle在32位windows上实施的培训 xff0c 恰好期间有几位Oracle用户邮件询问关于Windows系统调整问题 正好吧 xff0c 把准
  • iOS UIImage 图片局部拉伸的一些学习要点

    之前 做纯色局部拉伸 通过 top bottom left right 相交的阴影拉伸 屡试不爽 实施方法 imageView image 61 UIImage imageNamed 64 34 icon helper palace day
  • Python 查看模块的帮助文档,方法和帮助信息

    参考链接 xff1a https blog csdn net u013810296 article details 55509284 这里介绍下python自带的查看帮助功能 xff0c 可以在编程时不中断地迅速找到所需模块和函数的使用方法
  • 移动电源、3G路由拆机

    这款电源 4400mAh xff0c 淘宝也就八十元左右 xff0c 可以作为无线路由使用 xff0c 可以插 3G 网卡 xff0c 总的来说还算不错 xff0c 关键是外观精美 xff0c 网上一堆和华美 A100 那样的 xff0c
  • FreeRTOS——任务调度—抢占式,时间片和合作式

    以下转载自安富莱电子 xff1a http forum armfly com forum php 本章教程为大家将介绍 FreeRTOS 操作系统支持的任务调度方式 xff1a 抢占式 xff0c 时间片和合作式 xff0c 这部分 算是
  • Linux无网络怎么安装软件,解决无网络环境使用yum本地源安装软件

    搞运维的朋友经常会遇到单位的服务器使用的是内网 xff0c 编译安装时间长 xff0c 麻烦些 xff0c 使用yum安装相对简单 xff0c 由于不能联网所以配置本地yum源是必要的 其实配置本地源是很简单的 xff0c 只需要挂载上系统
  • 到了这个年纪,就应该阅读Spring源码了,源码阅读指南-编译加运行

    文章目录 到了那个年纪 xff0c 就应该阅读Spring源码了 x1f604 第一步 xff0c clone x1f606 第二步 xff0c 使用idea打开项目 x1f60a gradle介绍 xff08 插叙手法 xff09 x1f
  • 页面加载完成

    1 document ready function alert 34 页面加载完成 xff01 34 简写 xff1a function alert 34 页面加载完成 xff01 34 2 原生JS方法 window nl ad 61 f
  • Java写的斗地主游戏源码

    源码下载在最后 我们的前年的课设要求做一个斗地主程序 xff0c 当时正在愁如何做界面 xff0c 当时刚好在学习C xff0c 于是就用C 完成了这个程序 一方面 xff0c 当时我C 功底还很差 xff08 其实现在也不怎么样 xff0
  • 加密的m3u8、ts文件合并

    加密后的ts文件不能直接合并或播放 xff0c 需要使用key对每个ts文件进行解密 分为两种情况 xff1a 1 如果ts文件已经全部下载好 xff0c 则可以直接在本地通过ffmpeg快速解密合并 2 如果ts文件没有下载好 xff0c
  • 微信小程序:截图组件welCropper,实现原理及其使用

    最近做项目的时候 xff0c 需要做一个截图功能 用了一个别人写的截图工具 xff0c 发现截出的图质量下降了 xff0c 但是我们图片要用来做识别 需要保证截出的图质量不下降 而且也不支持通过拖动来调整截图框的大小 所以这个截图工具无法满
  • 时序数据从分表到分库

    这里的时序数据泛指一切随时间推移而不断增长的数据 xff0c 比如通话记录 银行交易记录等 对于数据库来讲 xff0c 时序数据并没有什么特殊性 xff0c 可以和普通数据一样放在数据表中 不过 xff0c 因为不断增长 xff0c 积累时

随机推荐

  • Elasticsearch7.1中文文档-第一章-入门

    入门 引言 Elasticsearch是一个高度可扩展开源的全文搜索引擎 它搜索几乎是实时的 用ES作为搜索引擎 为复杂搜索功能的需求提供解决方案 ES的使用场景 网上商场 搜索商品 ES配合logstash kibana 日志分析 本教程
  • VINS(一)简介与代码结构

    VINS Mono和VINS Mobile是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案 是基于优化和滑动窗口的VIO xff0c 使用IMU预积分构建紧耦合框架 并且具备自动初始化 xff0c 在线外参标定 xff0c 重定位 x
  • QTableView中设置单元格居中

    在获取想要设置的单元格对应的QStandardItem item xff0c 然后设置此item文本属性属性 xff0c 伪码如下 xff1a QStandardItem item 61 new QStandarItem 或者 GetQSt
  • MacBook Pro休眠掉电、耗电量大问题解决方案

    1 前言 最近我的2015mbpMacBook Pro Retina 13 inch early 2015 更新完10 14系统后 xff0c 发现休眠待机一晚上后能掉5 电 xff0c 白天待机4 5小时又掉了8 然而在此之前我记得休眠是
  • 推荐一本springBoot学习书籍---深入浅出springBoot2.x

    花了几周时间读完了这本书 确实是一本特别详细全面的书 而且不单单只是springBoot 书中还介绍了许多工作中常用的技术与springBoot的整合使用 当然 也有一些小bug 因为在代码实践过程发现和书中代码还是有区别的 当然我只发现了
  • 【simple-cache】我开发了一款只要一个注解就可以轻松实现缓存的框架

    x1f436 背景 xff1a 我们在写web项目的时候 xff0c 当大量的请求进来会导致我们数据库压力过大 xff0c 所以我们需要加入缓存来减轻数据库的压力 xff0c 但是现在市面上的很多缓存框架配置太复杂 xff0c 所以该框架只
  • 转载——为什么你睡了11个小时仍然觉得疲累?

    教你如何休息 为什么你睡了11个小时仍然觉得疲累 xff1f 为什么你花了好几万去岛国度假并没有增加生活的热情 xff1f 都说要去KTV xff0c 去夜店 xff0c 去游乐园就能忘掉不快 xff0c 更带劲地开始新的一天 xff0c
  • GreenPlum 数据库创建用户、文件空间、表空间、数据库

    前几篇文章介绍了GreenPlum数据库的安装 启动 关闭 状态检查 登录等操作 xff0c 数据库已经创建好了 xff0c 接下来介绍如何使用数据库 按照习惯 xff0c 需要先创建测试用户 表空间 数据库 先创建测试用户dbdream
  • 将Lua嵌入到自己的程序中

    什么是Lua Lua是具有简单数据描述的扩展编程语言 动态解析语言 它提供了非常好的面向对象编程 xff0c 函数式编程 functional programming xff0c 数据驱动式编程 data driven programmin
  • OpenCV——像素数据类型总结<摘>

    1 Unsigned 8bits 一般的图像文件格式使用的大小 IplImage数据结构参数 xff1a IPL DEPTH 8U CvMat数据结构参数 xff1a CV 8UC1 xff0c CV 8UC2 xff0c CV 8UC3
  • 关于warning: Clock skew detected. Your build may be incomplete. 的解决方法

    今天发现电脑的系统时间不对 xff0c 因此将时钟进行了改动 xff0c 回头编译Linux kernel的时候 xff0c 提演示样例如以下的warning xff1a warning Clock skew detected Your b
  • 8-4.桶排序算法详解

    1 桶排序介绍 桶排序 Bucket sort 是一种基于计数的排序算法 xff0c 工作的原理是将数据分到有限数量的桶子里 xff0c 然后每个桶再分别排序 xff08 有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序 xff
  • 我的年终总结,作为研发,在2018年都有哪些进步、收获与成长?

    2018 结束了 部门开会总结了过去的工作与未来的展望 xff0c 也是个不错的机会去回顾 审视 思考自己的 2018 年 玄难说过人与人的差距来自于思考与总结 xff0c 我深深地认同这一点 我也把自己的一部分思考写下来 xff0c 在公
  • cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local ..

    在安装opencv的时候 xff0c 会用 xff1a cmake D CMAKE BUILD TYPE 61 RELEASE D CMAKE INSTALL PREFIX 61 usr local 很久这这句话什么意思 xff01 在bu
  • 谈谈项目售前的经验:(个人观点)

    谈谈自己多年做网络项目售前的经验 个人观点 1 售前要熟悉市场 特别是你从事项目的决策链 项目的商务价格 同类项目竞争对手的价格分析等等 2 售前要熟悉项目的运作方式 实施 管理 客户的需求的深度挖掘 熟悉技术营销和解决方案营销 3 售前要
  • 【拥抱开源】发布自己的项目到maven中央仓库

    文章目录 x1f388 第一步 xff0c 注册账号 x1f4bf 第二步 xff0c 登录 x1f4c0 第三步 xff0c 设置信息 x1f4be 第四步 xff0c 创建问题 x1f4f9 第五步 xff0c 验证信息 x1f3a5
  • c# ros

    class MK Stream connection TcpClient con public MK string ip con 61 new TcpClient con Connect ip 8728 connection 61 Stre
  • Ubuntu中使用Docker/LXC迅速启动一个桌面系统

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 2013年07月18日 标签 cloud container docker lxc 作者 xff1a vpsee Docker 是 dotCloud 最近几个月刚宣布的开源
  • 自己写的小程序

    题目是 xff1a 输入n个学生成绩 xff0c 计算平均分 xff0c 并且统计不及格成绩的学生人数 自己这个程序和教材上是相同的 xff08 不谋而合 xff09 xff0c 哈哈 这次写的程序与之前比较更明了 xff0c 同学一下子就
  • 【编程好习惯】判断函数的返回值

    调用一个函数后要检查函数的返回值 xff0c 以决定程序是继续应用逻辑处理还是出错处理 xff0c 这理应是一个常识 xff0c 但在现实中 xff0c 却存在大量不检查函数返回值的代码 既然是常识 xff0c 但却得不到重视 xff0c