2017-12-23 154 views
6

Verilen kullanıcı girdisi geçersizse bir istisna ile karşılaşan bir kod yazdım, böylece bir try/catch bloğuna koydum ama yine de bir istisna attı . Kodun kendisi oldukça uzun olduğu için, istisnayla karşılaşan kodun basitleştirilmiş bir sürümü. Özel durumun kendisi açıktır, "3" pozisyonu o kadar doğal değildir ki, bir istisna atar, ama bir deneme/yakalama bloğunun içindedir, bu yüzden yakalanmalıdır, ama olmaz.Kod bir try/catch bloğu içinde olsa bile bir istisna almaya devam ediyorum

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

    } 
} 

Bu kodun çalıştırılması, bir try/catch bloğunda bulunup bulunmadığına bakılmaksızın, aşağıdaki istisnayla sonuçlanır.

Exception

Ben de istisna ( const out_of_range&e) belirterek çalıştı ama bu da yardımcı olmadı. Sadece aynı istisna neden oldu. Visual Studio kullanıyorum

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

    } 
} 

, bu IDE veya kullandığı derleyici ile bir sorun olabilir?

+0

Öğe 3, vektörünüzün bir üyesi değildir. Bunun yerine 2 kullanın. – Raindrop7

+2

Farklı türde * istisnalar vardır * bilgisayar sistemleri. Yazılımın, işletim sisteminin veya donanım hatalarının neden olduğu değil, yalnızca C++ 'dan atılanları yakalayabilirsiniz. İhtiyaç duyduğunuz gibi bir çökme [programlarınızı nasıl debug edeceğinizi öğrenin] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+1

* Çöküşünüzün ardında yatan sebepler için * [yeni başlayanlar kitaplarına] geri dönmelisiniz (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) ve bunları gözden geçirin . –

cevap

11

std::vector'un std::out_of_range istisnasını atmasını istiyorsanız, .at() yöntemini kullanmanız gerekir. operator[], bir istisna alamaz.

Örneğin, böyle bir şey yapabilirsiniz:

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

Bu bir istisna değildir. Bu bir hata ayıklama hatasıdır.

Bir istisna isteğinde bulunmak isterseniz, dizinin alt simge operatörünü değil, vektörlerin (dizin) işlevini kullanmanız gerekir.

1

operatör [] Vektör kabında aşırı ama (Davranış böyle yukarıdaki yazınıza olarak, arıza durumunda tanımlanmamış istisna güvenli değildir)

Bunun yerine .at() işlevini kullanmalısınız. Bu istisna güvenlidir. cplusplus.com referans der ki:

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. 

Okuma: istisna güvenliği için altta http://www.cplusplus.com/reference/vector/vector/operator[]/ http://www.cplusplus.com/reference/vector/vector/at/

bak.