C++ 例外规范

C++ 例外规范,c++,exception,exception-specification,C++,Exception,Exception Specification,我知道这个特性在C++0x中会被弃用,但对于我这个新手来说,拥有它似乎是个好主意。谁能给我解释一下为什么这不是个好主意 请参阅Herb Sutter的这篇详细文章。他对设计中的问题和不足有最透彻的解释 对异常规范的务实审视 审查 发布第一个:一个“影子类型系统” 真实、次要的技术要点,易于修复 发布第二个:(错误)理解 以下是许多人认为异常规范的作用: 他的第一点: 保证函数只抛出列出的异常(可能没有) 如果这是人们所想的,那就很好了,因为这正是ES所保证的,顾名思义。赫伯在同一份文件中

我知道这个特性在C++0x中会被弃用,但对于我这个新手来说,拥有它似乎是个好主意。谁能给我解释一下为什么这不是个好主意

请参阅Herb Sutter的这篇详细文章。他对设计中的问题和不足有最透彻的解释

对异常规范的务实审视

审查

发布第一个:一个“影子类型系统”

真实、次要的技术要点,易于修复

发布第二个:(错误)理解

以下是许多人认为异常规范的作用:

他的第一点:

  • 保证函数只抛出列出的异常(可能没有)
如果这是人们所想的,那就很好了,因为这正是ES所保证的,顾名思义。赫伯在同一份文件中同意:

(ES)在运行时强制函数只抛出列出的异常(可能没有)。

他的第二点:

  • 基于只抛出列出的异常(可能没有)的知识启用编译器优化
这也是绝对正确的

他用一个例子解释了为什么第二点是不正确的信念:

// Example 1(b) reprise, and two
// potential white lies:
//
int Gunc() throw();    // will throw nothing (?)

int Hunc() throw(A,B); // can only throw A or B (?)
评论正确吗?不完全是。Gunc()确实可能会扔东西,Hunc()很可能会扔A或B以外的东西!编译器只是保证,如果它们真的这样做了,就会把它们打得毫无意义……哦,而且在大多数情况下,也会把你的程序打得毫无意义

因为Gunc()或Hunc()确实可以抛出他们承诺不会抛出的东西,编译器不仅不能假设它不会发生(…)

Herb后一种说法是“(ES)在运行时强制函数只抛出列出的异常(可能没有)。”也反驳了这个“参数”

赫伯认为,赫伯的两个要点显然是绝对错误的

我还可以补充什么


我相信单词有固定的含义,不能为了“论点”而随意改变。据我所知,例外规范意味着:


我不希望你(编译器)生成额外的代码,以确保异常是这些类型之一。如果不打电话请终止,我们干杯了。在每次调用中,需要将额外的检查放入(隐式)异常处理程序(实现它所需的)中。

请参阅和。这不是一个论坛。@John Saunders:这是一个开放但合法的技术问题。从C++标准中删除该特性的原因是他们可以不带主观性或争论性地解释。@Jonathan:你为什么要把它指向我?@John Saunders:你可能想编辑你的评论,表明你在抱怨一些不相关的东西,这些东西后来被删掉了(以目前的形式,这是一个很好的问题)丹尼尔:乔纳森:我没有投反对票。该评论是针对@atch的,在SO中没有任何“私人消息”功能。当我否决投票时,我会说为什么。“以下是许多人认为异常规范的作用:-保证函数只抛出列出的异常(可能没有)。”纯属胡说八道。他们就是这么做的。“根据只抛出列出的异常(可能没有)的知识启用编译器优化。”这就是异常规范可以做的,一些主要的编译器确实可以做到这一点。@curiousguy你读过全文了吗?根据你的评论,听起来你在那句话之后就停止了。我不敢相信C++0x在2002年就已经开始了。好久不见了@MarkRansom I在错误、荒谬、荒谬的陈述成为“真相”之前,需要大量重复。这可能是我读过的最糟糕的GoTW。赫伯发现的每一个“问题”都是语言规范自己造成的,可以在新规范中简单地解决。。。例如,如果C++11只是允许在typedefs中使用异常规范,并将抛出无效异常的行为更改为“undefined”,那么这篇文章的90%将是不相关的。有人能反驳我提出的任何观点吗?或者我因为反对半神赫伯·萨特而被否决?更好的问题:你真的能证明你的观点吗?你只是说“这就是那样,句号”,这不是很有说服力。反驳别人没什么错<代码>赫伯的两个要点显然是绝对错误的。。好吧,让我们假设它对我来说不像对你那么明显。想解释一下到底什么是如此明显吗?不管怎样,问问赫伯。他非常同意我的观点,甚至写道ES“在运行时强制函数只抛出列出的异常(可能没有)。”因为编译器强制只抛出列出的异常,这意味着它保证只抛出列出的异常。这正是语言定义所说的。这并不是说有争论的余地——根本没有。这显然反驳了他的另一个观点,“因为Gunc()或Hunc()确实可以抛出他们承诺不会抛出的东西”。注意:我没有投反对票,我也不理解他们。撇开这一点不谈,保证某些东西和强制执行某些东西之间有着巨大的区别。这是一个混乱的来源,因为很多人相信前者,而C++只承诺后者。这就像“我向你保证,我永远不会偷你的东西。如果我尝试,我会被枪毙”和“我向你保证,你永远不会注意到我偷了你的东西,因为那时你已经被枪毙了。”(这是C++中的情况)。@Xeo你死后会怎么做?你有计划吗?如果你不为你的死做打算,那你就是在反驳赫伯和你自己。