Я нашел странное поведение в VisualStudio (2008 and 2013)
.VisualStudio debug продолжает необработанное исключение
Давайте начнет с testcode:
#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
.
Почему это происходит?
Что вы ожидали в противном случае? Вы просите приложение продолжить, и оно продолжается? Также в производственном коде вы, вероятно, должны проверять, является ли 'len' положительным в любом случае, прежде чем неявно лить его в целое число без знака. – stijn
Я бы предположил, что сообщение появляется только как напоминание, и при использовании 'continue' он будет делать то, что он будет делать без отладчика (в этом случае прервать) – Zaiborg