运行时错误和逻辑错误之间的区别

pie*_*lli 9 c++ runtime-error

我已经学习 C++ 两个月了,现在正在学习我的书(使用 C++ 的编程原理和实践)中有关错误的章节。但在研究了第一页之后,我有一个问题:运行时错误和逻辑错误之间有什么区别?根据我的书,运行时错误是在运行时检查发现的错误,我们可以进一步将运行时错误分类为:

  • 硬件错误/操作系统错误
  • 库检测到的错误
  • 用户代码检测到的错误(什么是用户代码?)

而逻辑错误只是程序员在寻找错误结果的原因时发现的错误。

我以为我已经理解了这种差异,但后来作者提供的一个例子让我产生了疑问。这是例子:

#include "std_lib_facilities.h"

int area(int lenght, int width) // calculate area of rectangle 
{
    return lenght * width; 
}

int framed_area(int x, int y) // calculate area within frame 
{
    return area(x - 2, y - 2); 
}

int main()
{
    int x = -1;
    int y = 2; 
    int z = 4; 
    int area1 = area(x, y); 
    int area2 = framed_area(1, z); 
    int area3 = framed_area(y, z); 
    double ratio = double(area1) / area3; 
}
Run Code Online (Sandbox Code Playgroud)

以下是作者对该示例的简要说明:

函数area()和framed_area()的调用导致负值,代表区域,被分配给area1和area2。我们应该接受这样的错误结果吗?但在回答这些问题之前,先看看比率的计算,在比率的计算中,area3 将为 0,除以 0 会导致硬件检测到的错误,从而以一些神秘的消息终止程序。如果您没有检测到并明智地处理运行时错误,那么您或您的用户将不得不处理这种错误。

我在这里不明白的是,为什么使用负值作为计算面积的函数的参数被视为运行时错误,这难道不是一个逻辑错误吗?我认为运行时错误只是由于例如将数字除以 0 和其他特殊情况而导致的错误。我是错了还是我只是误解了什么?逻辑错误和运行时错误之间的真正区别是什么?你能给我看一些小例子吗?

Bas*_*tch 13

运行时错误可能合法地发生:例如,某些文件包含垃圾数据,或某些错误的人为输入,或某些资源缺乏(没有更多内存、磁盘空间已满、硬件损坏、网络连接故障)。

根据定义,逻辑错误(或失败assert......)始终是程序中某些错误的症状,例如,用于二分访问的假定已排序的数组恰好未排序。

参见header的文档<stdexcept>

std::logic_error:此类定义作为异常抛出的对象类型,以报告程序内部逻辑中的错误,例如违反逻辑前提条件或类不变量。

std::runtime_error:此类定义作为异常抛出的对象类型,以报告只能在运行时检测到的错误。

我认为内部逻辑std::logic_error一个拼写错误,我将其理解为(程序的)内部逻辑,但我的母语不是英语。

如果您将程序的规范形式化(例如,在使用 ACSL 的Frama C的帮助下),您可能会发现(并且可能会纠正)逻辑错误;但你应该关心运行时错误。但规范中也可能存在错误。

了解阿丽亚娜 5 号 501 航班故障。并查看J.Pitrat 的博客以获得一些其他观点。