2017-12-23 99 views
6

Tôi đã viết một số mã gặp phải ngoại lệ nếu đầu vào của người dùng được cung cấp không hợp lệ vì vậy tôi đặt nó trong khối try/catch, nhưng nó vẫn ném một ngoại lệ . Bản thân mã này khá dài nên đây là một phiên bản đơn giản của mã cũng gặp phải ngoại lệ. Ngoại lệ chính nó là rõ ràng, vị trí "3" không tồn tại như vậy tự nhiên nó sẽ ném một ngoại lệ, nhưng nó bên trong của một khối try/catch vì vậy nó sẽ bị bắt, nhưng nó không.Tôi tiếp tục nhận được ngoại lệ ngay cả khi mã nằm trong khối try/catch

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (...) 
    { 

    } 
} 

Chạy mã này chỉ dẫn đến ngoại lệ sau bất kể có trong khối try/catch hay không.

Exception

Tôi cũng đã cố gắng xác định các ngoại lệ (const out_of_range&e) nhưng điều đó không giúp được gì. Nó chỉ gây ra cùng một ngoại lệ chính xác.

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (const out_of_range&e) 
    { 

    } 
} 

Tôi đang sử dụng Visual Studio, đây có phải là vấn đề với IDE hoặc trình biên dịch được sử dụng không?

+0

Yếu tố 3 không phải là thành viên của vectơ của bạn. Sử dụng 2 để thay thế. – Raindrop7

+2

Có nhiều loại * ngoại lệ * om hệ thống máy tính khác nhau. Bạn chỉ có thể bắt những người được ném từ C++ chính nó, không phải là những người được gây ra bởi phần mềm, hệ điều hành hoặc lỗi phần cứng. Một sự cố mà bạn cần phải [tìm hiểu cách gỡ lỗi chương trình của bạn] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+1

Vì lý do đằng sau sự cố * của bạn * bạn nên quay lại [sách người mới bắt đầu] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) và xem lại chúng . –

Trả lời

11

Nếu bạn muốn std::vector để ném một ngoại lệ std::out_of_range, bạn cần sử dụng phương thức .at(). operator[] không ném ngoại lệ.

Ví dụ, bạn có thể làm một cái gì đó như thế này:

std::vector<int> myvector(10); 
try { 
    myvector.at(20)=100;  // vector::at throws an out-of-range 
} 
catch (const std::out_of_range& e) { 
    std::cerr << "Out of Range error: " << e.what() << '\n'; 
} 
8

Đó không phải là ngoại lệ. Đó là một lỗi xác nhận lỗi.

Nếu bạn muốn có ngoại lệ, bạn cần phải sử dụng hàm at (chỉ mục) của vector chứ không phải toán tử chỉ số mảng.

1

operator [] bị quá tải trong các thùng chứa vector nhưng không phải là ngoại lệ an toàn (Hành vi là undefined trong trường hợp thất bại, chẳng hạn như trong bài viết của bạn trên)

Bạn nên sử dụng hàm .at() để thay thế. Nó là ngoại lệ an toàn. Các tài liệu tham khảo cplusplus.com nói:

Strong guarantee: if an exception is thrown, there are no changes in the container. 
It throws out_of_range if n is out of bounds. 

đọc: http://www.cplusplus.com/reference/vector/vector/operator[]/ http://www.cplusplus.com/reference/vector/vector/at/

Nhìn ở dưới cùng cho sự an toàn ngoại lệ.

Các vấn đề liên quan