Visual Studio调试继续未处理的异常

时间:2015-04-16 07:30:34

标签: c++ visual-studio debugging

我在VisualStudio (2008 and 2013)中发现了一种奇怪的行为。

让我们从测试代码开始:

#include <string>
#include <fstream>
#include <iostream>
using namespace std;

string readFile()
{
    std::fstream f;
    f.open("not_good_file.txt", std::fstream::in);

    if (!f.good())
        throw std::exception("unable to read file");

    f.seekg(0, f.end);
    std::streamoff len = f.tellg();
    f.seekg(0, f.beg);

    string result(len, '\0');
    f.read(&result[0], len);
    f.close();
    return result;
}

int main(int argc, char** argv)
{
    cout << "before exception" << endl;
    readFile();
    cout << "after exception" << endl;
    return 0;
}

在没有调试器的情况下运行时,应用程序会按预期中止,但是当我在调试时遇到无人看守的异常时,会显示已知的消息窗口以告诉我未捕获的异常。我得到break的选项,它显示抛出异常的行(如果可用)和选项continue(如名称所示)继续应用程序。

结果是,在执行异常之后直接执行代码,这意味着f.tellg()返回-1 std::string没有有效长度。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

  

结果是,在执行异常之后直接执行代码,这意味着f.tellg()返回-1,这对于std :: string没有有效长度。

调试器为您提供了运行选项,就好像异常不在那里(继续)或在异常站点中断(break)。

通常,当您选择继续时,应用程序应跳转到异常的catch块(或将unwindingm和然后堆叠到catch块)。您没有catch块,因此应用程序应跳转到std::terminate(并结束执行)。

让IDE为您提供“继续”选项,并且“call std :: terminate”的意思是坚果(因为那时“继续”实际上意味着“停止”)。所以在这种情况下,“继续”意味着“继续执行,好像异常不存在”,而不是“继续执行以终止应用程序”。