У меня есть вектор векторов для создания карты целых чисел, и я хотел бы поймать вектор вне диапазона ошибок, когда он генерируется, выполнив следующие действия:
vector< vector<int> > agrid(sizeX, vector<int>(sizeY));
try {
agrid[-1][-1] = 5; //throws an out-of-range
}
catch (const std::out_of_range& e) {
cout << "Out of Range error.";
}
Тем не менее, мой код, похоже, не улавливает ошибку вообще. Кажется, он все еще хочет запустить std :: terminate. Кто-нибудь знает, что с этим?
Если вы хотите, чтобы оно выдало исключение, используйте std::vector::at
1 вместо operator[]
:
try {
agrid.at(-1).at(-1) = 5;
}
catch (const std::out_of_range& e) {
cout << "Out of Range error.";
}
1 — возвращает ссылку на элемент в указанном месте pos
с проверкой границ. Если pos
находится вне диапазона контейнера, исключение типа std::out_of_range
брошен
В std :: vector :: operator [] (size_type) не применяется проверка диапазона (что хорошо). Функция std :: vector :: at (size_type) делает (что хорошо для ленивых программистов). Следовательно, убедитесь в правильности диапазона или проверьте сначала и сгенерируйте полезное исключение (если вам действительно нужно это сделать).
(Примечание: в отладочных компиляциях это может отличаться)