我已经学习 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 的博客以获得一些其他观点。