2017-12-23 133 views
6

Napisałem kod, który napotyka wyjątek, jeśli dane dane wejściowe użytkownika są nieprawidłowe, więc umieściłem je w bloku try/catch, ale wciąż wyrzucałem wyjątek . Sam kod jest dość długi, więc tutaj jest uproszczona wersja kodu, która również napotyka wyjątek. Sam wyjątek jest jasny, pozycja "3" nie istnieje, więc naturalnie wyrzuciłaby wyjątek, ale znajduje się wewnątrz bloku try/catch, więc powinien zostać złapany, ale tak się nie dzieje.Ciągle otrzymuję wyjątek, mimo że kod znajduje się w bloku prób/catch

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

    } 
} 

Uruchomienie tego kodu powoduje następujący wyjątek, niezależnie od tego, czy znajduje się w bloku try/catch.

Exception

Próbowałem również z określeniem wyjątek (const out_of_range&e), ale to nie pomogło. To spowodowało dokładnie ten sam wyjątek.

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

    } 
} 

Używam Visual Studio, czy może to być problem z IDE lub kompilatorem, którego używa?

+0

Element 3 nie jest elementem wektora. Zamiast tego użyj 2. – Raindrop7

+2

Istnieją różne typy * wyjątków * z systemów komputerowych. Możesz wychwycić tylko te, które są wyrzucane z C++, a nie te, które są spowodowane przez oprogramowanie, system operacyjny lub błędy sprzętowe. Taka awaria wymaga [dowiedz się, jak debugować swoje programy] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+1

Co do przyczyny twojego * wypadku * powinieneś wrócić do swoich [książek dla początkujących] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) i przejrzeć je . –

Odpowiedz

11

Jeśli chcesz, aby std::vector rzucił wyjątek std::out_of_range, musisz użyć metody .at(). operator[] nie generuje wyjątku.

Na przykład, można zrobić coś takiego:

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

To nie jest wyjątek. To jest awaria debugowania.

Jeśli chcesz uzyskać wyjątek, musisz użyć wektora w funkcji (indeks), a nie operatora tablicy indeksu.

1

operator [] jest przeciążony w pojemniku wektor ale nie jest bezpieczny wyjątek (zachowanie jest niezdefiniowane w przypadku awarii, takie jak w poście powyżej)

Zamiast tego należy użyć funkcji .at(). Jest wyjątkowo bezpieczny. Odniesienie cplusplus.com mówi:

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. 

Czytaj: http://www.cplusplus.com/reference/vector/vector/operator[]/ http://www.cplusplus.com/reference/vector/vector/at/

Spójrz na dole dla bezpieczeństwa wyjątku.