我阅读了一些关于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;
};
因此,当理论上变量有效时,使用断言是合法的,但是凌乱的用户可能会传递一些不适当的值。
assert
或exception
,只需使用条件。exceptions
。assert
应该使用的确切时间?assert
时还有其他任何情况吗?答案 0 :(得分:2)
TL; DR:例外是来自外部的异常但可恢复的错误,断言是内部的错误捕获。
如果程序正确, assert()
会在任何情况下陷入不应该发生的事情。目标是在程序进入不可能的状态之前暂停分析程序,然后在其他地方发生混乱和崩溃,使堆栈变得混乱或任何其他难以调试的故障。
您应该使用断言来检查函数是否输入了正确的参数(以捕获用户的错误),算法按照预期的方式工作(以捕获您自己的错误)等。
异常就是陷入可能(并且有一天会发生)的事情,并且不受任何程序员的控制,例如网络故障,内存不足,文件I / O问题等。是一个错误处理工具,它为它们提供了另一种代码路径。
您应该使用它们将错误传达给您可以处理它们的地方。例如,从客户端处理过程底部抛出的内存异常可能会重新启动并被主服务器过程捕获,然后主服务器程序将正常通知客户端并关闭其连接并继续正常工作。
答案 1 :(得分:0)
- 这是对的吗?
没有有限(或标准定义)正确方式使用assert()
- 或者在使用断言时还有其他任何情况吗?
恕我直言,它根本不应该被使用,而不是抛出异常
我个人讨厌assert()
(抛出异常)。
很难调试,除非您安装自己的abort()
处理程序,并且可以在那里放置断点。
此外assert()
仅对调试版本有效,并且可能导致生产程序中的UB,而在调试版本上运行的测试套件中没有它们。