C++ 例外与断言?

C++ 例外与断言?,c++,exception,throw,C++,Exception,Throw,可能重复: 在决定使用异常而不是断言时,是否有经验法则可以遵循(反之亦然)。现在,我只在我认为在运行时会在用户端发生的事情(比如套接字或文件错误)时抛出。我使用的几乎所有其他资产 另外,如果我抛出一个断言,那么抛出一个好的标准对象是什么?如果我没记错的话,有std::logic_error,但这不是一个好的抛出对象吗?对于丢失的文件或意外输入(例如从命令行而不是前端应用程序),我会抛出什么?对于异常情况,使用异常。例如,内存不足或网络故障 您可以使用assert确定满足了cetain前提条件。

可能重复:

在决定使用异常而不是断言时,是否有经验法则可以遵循(反之亦然)。现在,我只在我认为在运行时会在用户端发生的事情(比如套接字或文件错误)时抛出。我使用的几乎所有其他资产


另外,如果我抛出一个断言,那么抛出一个好的标准对象是什么?如果我没记错的话,有
std::logic_error
,但这不是一个好的抛出对象吗?对于丢失的文件或意外输入(例如从命令行而不是前端应用程序),我会抛出什么?

对于异常情况,使用异常。例如,内存不足或网络故障


您可以使用assert确定满足了cetain前提条件。例如,指针不为空或整数在某个范围内。

断言是验证程序是否处于可能状态的一种方法。如果一个函数返回-1,而它只返回正整数,并且您有一个断言来验证这一点,那么您的程序应该停止,因为它会使您的程序处于危险状态。

断言您知道不可能发生的事情(即,如果发生,则是您不称职的错误)


引发程序常规控制流未处理的异常情况。

作为一般规则,我抛出以下异常:

  • 用于捕获编程错误的包的公共函数
  • 报告系统错误或传递子系统错误的内部函数

  • 在这里,我只在内部使用断言来发现实现错误。

    我将断言用于不应该发生的事情,而应该做的事情。当这种情况发生时,开发人员需要重新审视错误的假设

    我对其他一切都使用例外

    在可重用代码中,我更喜欢异常,因为它为调用方提供了处理或不处理问题的选择。只要尝试捕捉和处理断言

    我的经验法则:

    异常用于运行时错误情况(IO错误、内存不足、无法获得数据库连接等)

    断言用于编码错误(此方法不接受null,并且开发人员还是传递了一个)

    对于具有公共类的库,在公共方法上抛出异常(因为这样做是有意义的)。断言是用来发现你的错误,而不是他们的错误


    编辑:由于空值示例,这可能不完全清楚。我的观点是,您使用断言(正如其他人所指出的)处理不应该发生的条件,处理不应该进入生产代码的条件。在单元测试或QA测试期间,这些条件绝对会失败。

    断言和确定的并行性不起作用。“断言”是肯定地声明,而“确定”是学习。因此,断言以“真”为前提,而“确定”则表明没有特别的偏见。这不是一个糟糕的记忆法,但建议的词源有缺陷。同意Argalatyr。断言是“坚持”、“大胆声明”或类似的意思。“确定”是“通过检查或实验确定地发现”,其中“发现”是同义词。此外,“特殊情况例外”规则可以使用澄清。为什么网络故障是异常的而不是空指针?您能否澄清为什么公共库方法应该抛出异常?我看不出一个人怎么可能从非法参数或坏的对象状态中恢复过来。如果您正在编写公共库方法,并且有人向您传递非法论点,您将抛出。你不能从中恢复过来。大概有人在用你的图书馆。纠正缺陷是他们的工作。你完全正确:你无法从中恢复。让你的来电者这样做。来电者如何恢复?如果开发人员不正确地使用我的库,这是一个编码错误,它既不应该从产品中恢复,也不应该出现在产品中。他通过在缺陷进入生产之前修复缺陷来进行恢复。问题是,已编译程序集的发布版本中删除了断言。如果您正在编译发布版本,则不能使用它。你必须抛出.related:,你说对了,这是一条简单的经验法则。奇怪的是,在关于异常和断言的Q中,你根本没有提到前者。但是你对断言的看法是:什么是“可能状态”?由于断言只在调试模式下运行,因此它们只应在开发人员中用于捕获不应编写的bug。一旦一个程序在野外运行,它就应该没有bug(我知道这是毫无希望的乌托邦,但让我感到幽默),并且可以在发布模式下运行,所以断言不会捕获任何东西。但错误可能是由于用户做了一些古怪的事情,包括我们从未想过“可能”的输入排列。。。因此需要例外