Mam duże doświadczenie w C# i .NET i tam nigdy nie było problemu takiego, jak w C++ się zdarza.
Piszę aplikację wykorzystując Qt, na przykład robię operacje na tablicach na stercie (na przykład int * tab
) i program się wysypuje przy próbie zapisu do elementu o dalszym numerze niż długość tablicy, co jest oczywiste i to się dzieje w obu językach (w C++ nie w każdym przypadku).
Próbując poszukać przyczyny problemu nieraz robiłem taką konstrukcję:
try
{
// tablica ma 100 elementów
tab[123] = 123;
}
catch (...)
{
cout << "Jest problem, ale nie wiadomo jaki" << endl;
}
Po uruchomieniu kodu, wbrew pozorom program też się wywala i nie wykonuje kodu zawartego w catch
. Dlaczego tak się dzieje?
Ten problem najczęściej się zdarza, jeżeli piszę program generujący i przetwarzający obraz poprzez pracę na strukturze bitowej, bądź też przy próbie wyświetlenia/odświeżenia obrazu na oknie. Przyczyną jest oczywiście jakiś błąd, najczęściej zapis bądź odczyt elementu dalszego niż długość tablicy lub elementu ujemnego.
Gdzieś czytałem, że żeby przechwycić każdy możliwy wyjątek, to w 'catch' podaje się '...' tak, jak w tym przykładzie. W jaki sposób można ustalić typ danego wyjątku (bez wymyślania wszystkich możliwych typów, które mogą zaistnieć w danej sytuacji)? Chodzi o to, żeby przy następnym teście tego samego kodu, w catch
obsłużyć bardziej dokładnie wyjątek danego typu, co znacznie ułatwi ustalenie przyczyny problemu (na przykład wypisanie komunikatu zwracanego przez wyjątek), przy założeniu, że w danej sytuacji try/catch
nie powinien mieć miejsca i nie powinien zdarzać się wyjątek.