如何在运行前检测到logic_error异常?

时间:2018-08-31 07:40:04

标签: c++ exception

c ++标准说,logic_error可以在运行前检测到 而runtime_error在运行时检测。

但是它如何工作? 我的问题是如何在运行时检测到逻辑错误。 你能举个例子吗?谢谢你的帮助〜!

2 个答案:

答案 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并不是扔在这里的理想之选,所以请举个例子。