写程序的时候,需要考虑理论上概率为零的意外情况吗?

2017-04-16 07:28:16 +08:00
 klxq15
比如一个数值输入计算,要先判断它是否全为数字,然后再计算
6877 次点击
所在节点    Python
61 条回复
unoyx
2017-04-16 09:38:36 +08:00
不是很理解你这个理论上为 0 ……
放在实际开发中,确实是能想到的错误出现的概率都不见得为 0 。即使是内存 bit 读写会翻转,这种问题放到一些环境下也是需要进行处理的。
所以实际上开发中的错误一般是依据出现的上下文,可能产生的影响,或者说是各种处理方案的性价比来决定处理方案。
具体到你的例子,如果这个处理放在用户输入部分。即使你事先准备了各种提醒,那也架不住用户一不小心做了错误的输入。而且这种时候你不做处理那么程序可能会 crash ,用户体验会非常糟糕,那么最好是预先阻止掉各种意外的输入。如果你的处理只是一个内部调用的子函数,而且你已经和调用方约定好了输入只能是数字,那么再出现问题一般就是由调用方进行处理了。
Cbdy
2017-04-16 09:45:27 +08:00
断言就是这个时候用的
cwlmxwb
2017-04-16 10:03:55 +08:00
@lucifer9 此话怎讲
infun
2017-04-16 10:06:26 +08:00
@lcorange 哈哈哈。
sagaxu
2017-04-16 10:11:17 +08:00
用户输入,任何情况下都要检查。 API 调用,契约式编程无需检查,防御式编程要检查。
vincentqi
2017-04-16 10:21:58 +08:00
曾经有一个产品经理的用户名是 null
Phariel
2017-04-16 10:23:42 +08:00
墨菲定律 有几率会发生的事情一定会出错 并且人类认为零概率的东西通常都有概率发生
wly19960911
2017-04-16 10:23:56 +08:00
就算前端可以帮你挡住,假如有人要发包测试呢,这东西没有 0%的,如果不涉及数据库和业务的话我懒得检测,涉及的话该怎么样就怎么样
bukip
2017-04-16 10:49:30 +08:00
“比如一个数值输入计算,要先判断它是否全为数字”

这种可能性远远大于 0
iyaozhen
2017-04-16 10:54:27 +08:00
你举得例子和你的标题不符呀。
编程法则:不要信任任何用户输入

但比如说你是强类型语言申明了输入类型或者框架上做了处理,这种业务代码上就不用判断了
gamexg
2017-04-16 11:16:10 +08:00
我的做法:

用户输入类的,需要检查并给出友好提示。

如果是其他函数调用提供的参数,那么做一次强制转换,失败了不管,异常直接抛出去,由调用方处理。

如果是类似 https://www.v2ex.com/t/355154 里面的 355154 ,理论合法用户不会出现非数字的情况,这种直接同函数调用,直接抛异常。但是别忘了设置整站的 500 页面及错误日志。
jayzjj000
2017-04-16 12:32:48 +08:00
作为开放出去的公用库,只要不是强类型,都建议判断

另外,另一种思路是如果产生了这种异常分支,不处理这个分支对整个工程的影响,拿正文举例:
- 如果不处理的结果是输出不满足输入结果需要,那么可以不处理,因为输入结果就是错误的
- 如果不处理的结果是抛异常或者 Crash ,那么再怎么样都要处理,防止出现“你这个函数写的容错性怎么这么差”的攻击机会
Khlieb
2017-04-16 12:35:00 +08:00
这就需要采取边界检查的机制
wanttofly
2017-04-16 12:44:10 +08:00
哎,其实最悲剧的是你写程序考虑了很多低概率事件,设想了很多极端的情况,却发现一个用户都没有操作到那种情况简直想死,哦,因为没人用。哈哈!
phrack
2017-04-16 12:46:44 +08:00
never trust any input
anuan
2017-04-16 13:25:04 +08:00
先跑起来再说别的
lc4t
2017-04-16 13:26:29 +08:00
射飞镖的时候射中盘上任意一点概率都是 0 ,因为点 /面=0 ,但是只要射中了概率为 0 的事情就发生了,所以概率为 0 不是不可能发生。

对于用户的输入,即便用户完全不可能输入一个值,也要防止测试给你一个意外输入。总之原则上就是考虑所有可能。
viator42
2017-04-16 13:31:17 +08:00
我觉得能做的验证还是尽量做,一方面防那些搞事情的,另一方面减少出一些奇怪的 bug 。墨菲定律不信不行啊
crist
2017-04-16 13:33:13 +08:00
为 0 你考虑个卵!
kaneg
2017-04-16 14:16:05 +08:00
如果真的概率很低,比如 CPU 的逻辑门被宇宙射线改变了电平,是可以不用考虑。可问题你提的用户输入是否数字,这个出错的概率太高了,起码有 2 , 3 成。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/355154

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX