我在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
没有有效长度。
为什么会这样?
答案 0 :(得分:1)
结果是,在执行异常之后直接执行代码,这意味着f.tellg()返回-1,这对于std :: string没有有效长度。
调试器为您提供了运行选项,就好像异常不在那里(继续)或在异常站点中断(break)。
通常,当您选择继续时,应用程序应跳转到异常的catch块(或将unwindingm和然后堆叠到catch块)。您没有catch块,因此应用程序应跳转到std::terminate
(并结束执行)。
让IDE为您提供“继续”选项,并且“call std :: terminate”的意思是坚果(因为那时“继续”实际上意味着“停止”)。所以在这种情况下,“继续”意味着“继续执行,好像异常不存在”,而不是“继续执行以终止应用程序”。