我不知道是否有一种理论,但是可能有一种新兴的实用实验科学。
我能想到的最好的资料是Bjarne Stroustrup,《 C ++的设计和演进》,Addison-Wesley,1994年。如果我没记错的话(这是一本非常好的书,人们一直向我借书而不退还,所以目前我没有副本),其中有一章是关于例外的。Stroustrup领导下的C ++委员会需要大量的经验证据,证明提议的功能是必要的,然后他们才愿意将其添加到语言定义中。该有关异常维基百科页面有来自那本书以下报价:
在1991年11月的Palo Alto [C ++标准化]会议上,我们听取了关于终止语义学论点的精彩摘要,这些论据以个人经验和吉姆·米切尔(来自Sun,原为施乐PARC)的数据为后盾。Jim在20年的时间里使用了六种语言的异常处理,并且是Xerox Cedar / Mesa系统的主要设计者和实现者之一,是恢复语义的早期拥护者。他的信息是终止比恢复更可取;这不是意见问题,而是多年经验的问题。恢复是诱人的,但无效。他以来自多个操作系统的经验来支持此声明。关键示例是Cedar / Mesa:它是由喜欢并使用恢复功能的人编写的,但是使用十年后,50万行系统中只剩下一种恢复使用的方法,那就是上下文查询。由于恢复实际上不是进行此类上下文查询所必需的,因此他们将其删除,发现该系统部分的速度显着提高。在过去的十年中,在每一种使用恢复的情况下,它都成为一个问题,更合适的设计取代了它。基本上,每次使用恢复都表示未能保持单独的抽象层次不相交。在过去的十年中,在每一种使用恢复的情况下,它都成为一个问题,更合适的设计取代了它。基本上,每次使用恢复都表示未能保持单独的抽象层次不相交。在过去的十年中,在每一种使用恢复的情况下,它都成为一个问题,更合适的设计取代了它。基本上,每次使用恢复都表示未能保持单独的抽象层次不相交。
在C ++中,真正的胜利是RAII,它使出错期间处理资源的重新分配变得更加容易。(它不废除需要throw
和try
- catch
,但它意味着你不需要finally
。)
我认为说服他们需要异常的是通用容器:容器编写者对所包含的对象可能需要返回的错误种类一无所知(更不用说如何处理它们了),但是将这些对象插入到对象中的代码却一无所知。容器必须了解那些对象的接口是什么。但是,由于我们不知道所包含的对象会抛出哪种错误,因此无法对异常类型进行标准化。(相反:如果我们可以标准化异常类型,那么我们就不需要异常。)
人们多年来学到的另一件事是,异常规范很难正确地用语言表达。例如,请参见:http : //www.gotw.ca/publications/mill22.htm或http://www.gotw.ca/gotw/082.htm。(不仅是C ++,Java程序员对于使用受检查的异常还是未经检查的异常也有很长的争论。)
关于例外的历史。经典论文是:John B. Goodenough:“异常处理:问题和建议的符号”,Commun。ACM 18(12):683-696,1975年。但是在此之前,例外是已知的。Mesa在1974年左右拥有了它们,PL / I也许也有它们。阿达有一个异常机制1980年之前,我认为C ++的例外情况,大多数与芭芭拉·利斯科夫的CLU编程语言的经验,从大约1976年的影响 在‘CLU的历史’:芭芭拉Liskov的历史编程语言--- II,托马斯J. Bergin,Jr.和Richard G. Gibson,Jr.(编辑)。pp.471-510,ACM,1996。