免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xyk6
打印 上一主题 下一主题

哪个语言首先提出“异常处理”,是C++吗? [复制链接]

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
31 [报告]
发表于 2008-12-29 13:44 |只看该作者
何谓异常?

异常就是所有“不在设计支持范围内的情况”。
——换言之,凡我没考虑到、或考虑到但没打算处理的东西,都是异常。

比如,有人穿一双大胶鞋专踢网线,这是异常;
有脑子进水的程序员,偏要把NULL传给strcpy,这也是异常;
new不到内存,除少量系统级程序要自己准备“后手”外,对99%的软件来说都是异常(所以,为什么要发神经检查new没new到空指针?);


看这个定义:
struct my_pkg
{
        int pkg_type;
        int pkg_seq_no;
        int pkg_length;
        char data[0]; //或char data[1]
}
这是个司空见惯的手法,用以定义“不定长包的包头”——这时候,数组越界访问其实是必不可少正常手段。

——除此之外,大多数情况下,数组访问越界都是异常。



看完上述那些,再考虑考虑什么是异常?!


异常是设计师定义的东西——我说是异常,它就是异常;我说不是异常,它就是正常。
不同点在于,如果我胡说,这软件自然就写的稀巴烂;我思维清晰,软件质量就高。


没搞明白这个,“异常处理”这个问题,还是缓一缓再说。


何谓异常处理?
对照前面,很简单: 对设计师我来说,有些情况是我不喜欢看到的;谁发现了,谁就应该大声喊起来: 出错了出错了!(这就叫抛异常)
然后,我自然会安排人去应付这种情况。(异常处理)

只不过,实践中,大多设计师还没有能力考虑到这个层面。

现实中,有人发现错了,他可以:
a、默不作声,假装没看见

b、返回个数值表示有错,然后希望老天开眼,上面会处理这个错误

c、exit(0)(或assert,或直接触发操作系统的验证,让它传个信号过来)

d、throw,但不捕获(或像我曾经用过那样,让标志不同错误类型的不同立即数除以0,这样如果我看到0x1233/0这样的错误,就知道大概是什么地方的问题了)

e、throw,并且捕获——但常常被垃圾设计师搞得乱七八糟(或者,也可以像我现在喜欢用的那样,对关键模块用局部临时对象的析构函数记录错误并清理现场——如果高层模块需要,它自然可以catch-all,然后尝试重做)


a和b估计不是任何想把东西做好的人所愿意看到的;c和d在业界被普遍采用;e只有在需要绝对稳定性的场合使用(比如ms word错误时可以自动保存用户编辑过的数据到临时文件)——事实上,测试够充分的话,c和d的层次也就够了;e多少有点过度设计的味道。

论坛徽章:
0
32 [报告]
发表于 2008-12-29 15:18 |只看该作者
原帖由 shan_ghost 于 2008-12-29 13:44 发表
何谓异常?

异常就是所有“不在设计支持范围内的情况”。
——换言之,凡我没考虑到、或考虑到但没打算处理的东西,都是异常。

比如,有人穿一双大胶鞋专踢网线,这是异常;
有脑子进水的程序员,偏要把 ...


使用一个他人设计的模块,如果这个模块有这样或那样问题怎么办?这时大部分程序员跟你的想法一样,不去找这个模块的设计者确认或告诉他“你设计的模块有毛病,请及时更正,别耽误我使用”,  而是自己在那闷头想办法提升自己代码的容错能力,这是错误的!

记住:作为一个产品(软件模块)的用户,只有使用优质的产品(软件模块)的权利,没有无偿维护劣质产品(软件模块)的义务。

[ 本帖最后由 qvppvq 于 2008-12-29 16:41 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2008-12-31 10:33 |只看该作者
正确的使用try...catch可以使程序使清晰,对一些已知可能会产生例外的情况(注意例外和错误的区别,例外举例:文件操作,端口操作等)用try...catch包起来是一种良好的编程习惯,因为这样结构更清晰。一个try可以跟多个catch,catch某一个特定异常,处理该个异常,catch另一个异常,处理该个异常...,最后catch所有其他异常,throw... 程序一直是从上往下顺序在走,出了问题定位也比较方便,当然只catch不处理也不throw的除外。

[ 本帖最后由 sunnyfun 于 2008-12-31 10:39 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2008-12-31 12:54 |只看该作者
捕获“数组”越界也不是啥了不起的技术,c++用vector就可以
只是某些语言偷偷的使用类似vector之类的机制,再把那个东西称为”数组”

论坛徽章:
0
35 [报告]
发表于 2008-12-31 19:39 |只看该作者
原帖由 reiase 于 2008-12-26 09:09 发表
异常处理,本质上不就是return嘛,不是什么了不起的技术

不过C++不告诉你那就是return,留着装13用




显然不是.......

论坛徽章:
0
36 [报告]
发表于 2008-12-31 20:57 |只看该作者
异常处理机制是很古老的东西。C以前的语言就有异常处理。就连BASIC,多数编译器版本都有不同程度的异常处理机制。
C是效率优先的语言,就去掉了异常处理机制。
C++是在C基础上发展的,自然在这方面先天不足。
Java就有较好的异常处理机制。

论坛徽章:
0
37 [报告]
发表于 2008-12-31 21:08 |只看该作者
扯些什么,乱七八糟的!
C++的结构化异常从ADA发展而成,但至于ADA是否是最早应用结构化异常的我就不清楚了。
另外,请不要随便说“不要考虑”之类的绝对之言。异常问题如同人生问题,是不可老问但又不能不问的。

论坛徽章:
0
38 [报告]
发表于 2008-12-31 22:28 |只看该作者
erlang的 速错 方式才是正途,防御式的编程最终是死路一条

[ 本帖最后由 isun 于 2008-12-31 22:29 编辑 ]

论坛徽章:
0
39 [报告]
发表于 2009-01-02 15:21 |只看该作者
"哪个语言首先提出?" Java? C? COBOL? Ada?...

没有一点意义的问题.

论坛徽章:
0
40 [报告]
发表于 2009-01-02 15:23 |只看该作者
原帖由 姚世友 于 2009-1-2 15:21 发表
"哪个语言首先提出?" Java? C? COBOL? Ada?...

没有一点意义的问题.


你认为该怎么问?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP