C++ 对 class 使用断言?

C++ using assert for class?

我读了一些关于 assert 的帖子,毕竟我只能想象以下用法是合法的:

class Class
{
public:
    Class( Requirement* aRequirement )
    : m_Requirement( aRequirement )
    {
    }

    // ...

    void doSomething()
    {
        // Theoretically it is always set, but it is
        // possible that a messy user passed a null pointer.
        assert( m_Requirement != nullptr );

        // ...
    }

    // ...

private:
    Requirement* m_Requirement;
};

因此,当理论上变量有效时,使用断言是合法的,但有可能是乱七八糟的用户传递了一些不合适的值。

  • Is that correct ?

没有有限的(或标准定义的)正确使用assert()

的方式
  • Or is there any other cases when assert shall be used ?

恕我直言,为了抛出异常,根本不应该使用它。
我个人讨厌 assert()(相对于抛出的异常)。

很难调试,除非您安装自己的 abort() 处理程序并可以在那里放置断点。

此外 assert() 仅在调试版本中有效,并且可能会导致生产程序中出现 UB,而调试版本中的测试套件 运行 并未发现它们。

TL;DR:异常是针对异常但可从外部恢复的错误,断言是为了在内部捕获错误。

如果程序正确,

assert() 是为了捕获 不应该 在任何情况下发生的事情。目标是在程序进入不可能的状态时立即停止程序进行分析,以免程序失控并在其他地方崩溃、混淆堆栈或任何其他难以调试的故障。

您应该使用断言来检查函数是否提供了正确的参数(以捕获用户的错误),算法是否按照预期的方式工作(以捕获您自己的错误)等。

这里的异常是为了捕获可能(并且有一天会)发生的事情,并且不在任何程序员的控制之下,例如网络故障,内存不足,文件I/O 问题等。它们是错误处理工具,为它们提供替代代码路径。

您应该使用它们将错误传达给您可以处理它们的地方。例如,从客户端处理程序底部抛出的内存异常可能会飞回并被主服务器程序捕获,然后主服务器程序会优雅地通知客户端并关闭其连接并继续正常工作。