Попытка поймать не работает, исключение, вызванное 0x00476F1E в game1.exe : 0xC0000005: Местоположение чтения 0x00000004 с нарушением доступа

#c #try-catch

#c #попытка перехвата

Вопрос:

Код:

 try {
    SDL_SetColorKey(surfaces[folderCnt][surfacesCnt], SDL_TRUE, SDL_MapRGB(surfaces[folderCnt][surfacesCnt]->format, 255, 0, 255));
}
catch (int err) {

}
  

Ошибка:
Исключение, выданное в 0x00476F1E в game1.exe : 0xC0000005: местоположение чтения 0x00000004 с нарушением доступа.

Когда surfacesCnt = 10, выдается ошибка. Это потому, что нет поверхности 10. Я знаю это, и я хочу перехватить исключение и обработать следующую поверхность (surfacesCnt = 11).

Почему операторы try catch не улавливают ошибку? Это будет отлично работать в Python и Pascal.

Комментарии:

1. Это исключение, вызванное ОС или процессором, или чем-то еще ниже C . Вы не можете перехватить с помощью try / catch. Ваша программа получила доступ к нулевому указателю и завершилась сбоем. Даже если вы перехватите и обработаете, установив обработчик сигналов, велика вероятность, что ваша программа слишком сломана, чтобы быть безопасной для продолжения. Ваш лучший вариант — протестировать и обработать заранее.

2. Хорошо. Я точно знаю, что вызывает ошибку и как ее исправить. На самом деле это намеренно. Я создам эту недостающую поверхность, но мне просто интересно, почему try catch не работает.

3. Я немного разочарован всем, что убрано из C ради производительности по сравнению с другими языками программирования. Но в то же время это не имеет большого значения, потому что я могу все это обойти.

4. @Seb0029 Неустранимые ошибки существуют в C не только из соображений производительности, но и потому, что логические ошибки по своей сути неустранимы. Они возникают из-за ошибки программиста , а не из-за ошибок пользователя, ввода или внешних ошибок, что указывает на наличие фундаментальной логической ошибки в вашем коде, поэтому вашему коду нельзя доверять, даже если он пытается восстановиться после этой ошибки.

5. @Seb0029 исправьте нарушение доступа, поскольку его невозможно перехватить в C , обработка индекса, при которой у вас нет данных, как вы упомянули в 10-м индексе. Можете ли вы использовать какой-нибудь код, в котором вы заполняете переменную surfaces. Справка по обработке исключений isocpp.org/wiki/faq/exceptions