Google thử nghiệm không liên quan ở đây. Việc thực thi Thư viện chuẩn C++ của bạn là ném một ngoại lệ, và tùy thuộc vào việc thực hiện Thư viện chuẩn C++ của bạn để quyết định cách tiết ra các ngoại lệ của nó.
Vì bạn đang nhận được ngoại lệ, tôi cho rằng bạn đang sử dụng std::vector::at
thay vì std::vector::operator[]
. Có một số phương pháp có thể bạn có thể thực hiện để nhận thêm thông tin.
Đầu tiên, bạn có thể thay thế các cuộc gọi đến at
bằng các cuộc gọi đến operator[]
(cá nhân, tôi không tìm thấy phạm vi kiểm tra ngoại lệ là rất hữu ích và có phí hoạt động) và sử dụng tiêu chuẩn C++ của bạn Gỡ lỗi trình lặp của thực hiện thư viện. Ví dụ, với g ++, nếu tôi sử dụng operator[]
và biên dịch với -D_GLIBCXX_DEBUG
bật phạm vi kiểm tra operator[]
, tôi nhận được một lỗi tương tự như sau:
/usr/include/c++/4.3/debug/vector:237:error: attempt to subscript container
with out-of-bounds index 0, but container only holds 0 elements.
Thứ hai, bạn có thể thay thế các cuộc gọi đến at
với các cuộc gọi đến test_at
hoặc tương đương: (chưa được kiểm tra)
template <typename T>
T& test_at(std::vector<T>& v, size_t n) {
// Use Google Test to display details on out of bounds.
// We can stream additional information here if we like.
EXPECT_LT(n, v.size()) << "for vector at address " << &v;
// Fall back to at, and let it throw its exception, so that our
// test will terminate as expected.
return v.at(n);
}
Nguồn
2013-01-11 16:08:07
--gtest_catch_exceptions = 0 – JaredC
@JaredC lá cờ này chấm dứt kiểm tra sau khi ngoại lệ được ném, nhưng đầu ra không cung cấp thêm thông tin về nguồn gốc của ngoại lệ (vectơ, chỉ mục, phạm vi) – clstaudt
@cls: Nếu bạn chạy kiểm tra trong một trình gỡ lỗi, hoặc kiểm tra kết xuất lõi sau khi kết thúc, sau đó bạn sẽ thấy nơi mà các ngoại lệ unhandled đã được ném từ. Ngoài ra, bạn có thể đặt một điểm ngắt trên 'std :: __ throw_out_of_range', đó là hàm mà thư viện GNU gọi để ném ngoại lệ. –