c ++标准说,logic_error可以在运行前检测到 而runtime_error在运行时检测。
但是它如何工作? 我的问题是如何在运行时检测到逻辑错误。 你能举个例子吗?谢谢你的帮助〜!
答案 0 :(得分:5)
C ++标准对此logic_error
(第22.2.2节)进行了说明:
类
logic_error
定义了作为异常抛出的对象的类型,以报告可能在程序执行之前检测到的错误,例如违反逻辑先决条件或类不变式。
这并不意味着可以在编译时捕获异常。这意味着可以在编译时通过其他方式(编译器警告,代码分析等)检测到异常的原因。
答案 1 :(得分:2)
我认为您的误解是在引发异常的原因与异常本身之间。即使在完全没有错误的程序中,也存在无法避免的异常,例如由用户输入引起的异常。然后,显然还有其他异常是由编写逻辑上错误的代码引起的。考虑一下此功能:
double sqrt(double x); // takes only positive numbers
现在,如果我像这样使用此功能:
double y = sqrt(-2);
然后我犯了一个逻辑错误。我不尊重函数参数的前提条件。在这种情况下,为sqrt抛出std::logic_error
(而不是普通的runtime_error
)是正确的(*)。
double sqrt(double x) {
if (x < 0) throw std::logic_error();
//....
现在,当您在某个地方读到“可以在运行时之前检测到逻辑错误”时,这很可能是指这样的事实,即人们可以读取代码并看到调用sqrt(-2)
确实是错误的并可以解决。但是,请注意,这与引发实际异常(纯粹是运行时概念)无关。
因此,从字面上回答您的问题:通过仔细的分析,您可以检测代码中的逻辑错误。注意编译器警告,要求同事进行审查,使用静态分析工具等。
(*)=也许logic_error
并不是扔在这里的理想之选,所以请举个例子。