C++ &引用;我们不使用C++;“例外情况”—;什么';还有什么选择?让它崩溃?

C++ &引用;我们不使用C++;“例外情况”—;什么';还有什么选择?让它崩溃?,c++,exception,C++,Exception,如果不使用异常,当出现错误时会发生什么?您只是让程序崩溃了?如果您不按照定义使用异常,那么没有代码会抛出异常,因此不需要捕获它 是“我们不使用C++异常”,不是“我们不捕获C++异常”。 < p>使用错误代码返回函数的版本,根据返回值来执行。< /P> < P>不,替代是做C.人已经做了很久的事情。返回一个错误状态代码,该代码指示函数是否成功,并且根据函数可能失败的方式,您可能有一个或多个out参数,用于指示函数失败的方式(或者将失败类型合并到错误状态代码中,这也是一个逐案处理的问题).或者您可


如果不使用异常,当出现错误时会发生什么?您只是让程序崩溃了?

如果您不按照定义使用异常,那么没有代码会抛出异常,因此不需要捕获它


是“我们不使用C++异常”,不是“我们不捕获C++异常”。

< p>使用错误代码返回函数的版本,根据返回值来执行。< /P> < P>不,替代是做C.人已经做了很久的事情。返回一个错误状态代码,该代码指示函数是否成功,并且根据函数可能失败的方式,您可能有一个或多个out参数,用于指示函数失败的方式(或者将失败类型合并到错误状态代码中,这也是一个逐案处理的问题).

或者您可以进一步阅读:

从他们的脸上看,使用 例外情况超过了成本, 尤其是在新项目中。然而, 对于现有代码,引入 例外对所有人都有影响 依赖代码。如果例外情况可以 传播到一个新项目之外,它 整合也变得有问题 将新项目转化为现有项目 无异常代码。因为大多数 谷歌上的C++代码不存在 准备好处理例外情况,它 比较难采用 生成异常的新代码

考虑到谷歌现有的代码是 不例外的容忍,成本 使用异常稍微好一些 而不是新项目的成本。 转换过程会很慢 而且容易出错。我们不相信 现有的替代方案 异常,如错误代码和 断言,引入一个重要的 负担

我们反对使用异常的建议是 不以哲学或哲学为基础的 道德基础,但实际基础。 因为我们想用我们的 谷歌和谷歌的开源项目 如果这些 项目使用异常,我们需要 针对谷歌的例外情况提出建议 开源项目也是如此。东西 如果我们有可能会有所不同 从头再来一遍

此规则有一个例外(否 双关语)用于Windows代码


链接样式指南对此进行了很好的解释:

从他们的脸上看,使用 例外情况超过了成本, 尤其是在新项目中。然而, 对于现有代码,引入 例外对所有人都有影响 依赖代码。如果例外情况可以 传播到一个新项目之外,它 整合也变得有问题 将新项目转化为现有项目 无异常代码。因为大多数 谷歌上的C++代码不存在 准备好处理例外情况,它 比较难采用 生成异常的新代码


< C++ >在不使用异常或担心异常保证的情况下,创建健壮代码相对容易。对于返回代码和断言,异常实际上仅限于程序员错误。

如果您在编写代码时发现了一个问题,通常会抛出异常,但希望遵守一些规定,即不使用异常,然后,您必须找到另一种方法让客户机代码知道错误

与许多现有答案文档一样,您可以返回sentinel值(例如,真/假成功值、枚举)。POSIX和libc指定的常见C函数(如fopen()、strstr()或printf())中广泛使用了这种做法

另一个重要的选项是设置一些内部状态,以便以后查询。你为什么想要或需要做后者?因为一些重要的C++构造函数和操作符通常不会给你返回错误代码的机会。例如,在:

X x1(something), x2(whatever); fn(x1 + x2); 请注意,此错误处理约定非常冗长,并且容易被客户机编码人员忽略,这是创建异常的原因之一。大多数浮点硬件都使用了一个有趣的变化-某些操作(如0除或欠/溢出)可能会将寄存器设置为前哨值,例如不是数字“NaN”或+/-无穷大,然后在这种状态下涉及参数的操作会将状态传播到其结果。例如,
x=8+y/0;z=x+2也将
z
设置为哨兵。这里的想法是,只要有可能,您就可以编写计算正确结果的代码,并在使用结果之前检查一次,以查看计算代码中任何地方的错误是否使该结果无效。它有时适用于数学代码,特别是当您没有根据变量的当前值做出分支决策时,但不幸的是,在许多情况下,您可能无法或不希望让潜在无效对象代码的所有用户都具有超强的防御能力来处理和传播错误状态

使用C++无例外,严重损害了语言的可用性、可维护性、简洁性和优雅性。


作为全面禁止异常使用的替代方案,在某些环境中,您可能能够捕获API边界处的所有异常,然后以“C”样式返回错误代码或sentinel值。这允许更好的内部编码,但更好的外部互操作性。遗憾的是,有时任何异常的使用都是不切实际的,因为您的代码将在没有提供异常处理机制的环境中执行。。。可能在内核、驱动程序或嵌入式环境中,使用精简的C++风格编译器。这样的环境不是真正的C++,因为它不是标准兼容的。

< P>除了返回代码之外的异常:

  • LISP风格的条件处理程序
  • 软件信号和插槽,QT风格
  • 硬件中断
    X x1(something), x2(whatever);
    assert(x1.is_valid() and x2.is_valid());
    X x3 = x1 + x2;
    assert(x3.is_valid());
    fn(x3);