Разъяснение касательно обработки исключений в C ++ - PullRequest
0 голосов
/ 12 июля 2010

Рассмотрим следующий код:

try {
   int *i = NULL;
   i[100] = 20;
catch (...) {
   std::cout << "Exception Caught";
}

При запуске этого кода происходит сбой (очевидно, при обращении к нулевому указателю). Хотя в режиме отладки Visual Studio заявляет об исключении Uncaught, касающемся нарушения прав записи ... также понятно.

Я ожидал, что здесь будет поймано исключение, но нет.
Я пришел к выводу, что не исключение не выбрасывается.
Так почему же VS предупреждает о неисследованном исключении?

Этот вопрос начался, когда я хотел защитить себя от кода другого программиста и хотел обернуть вызовы его функций try-catch, предполагая, что он может совершать некоторые нарушения доступа. Но если я могу ловить только те исключения, которые выкинуты точно, я просто облажался. Единственное другое объяснение, которое я могу иметь, это то, что это из-за какой-то конфигурации проекта или компилятора. Я запустил это в новом консольном приложении C ++ VS2005.

Спасибо

Ответы [ 6 ]

5 голосов
/ 12 июля 2010

Чтобы catch (...) перехватывал так называемые структурированные исключения, необходимо включить это в настройках проекта.

3 голосов
/ 12 июля 2010

Нарушение прав доступа не является исключением C ++ и не может быть перехвачено оператором catch.Необработанное сообщение об исключении в окне вывода не означает, что это исключение C ++.Сообщения об исключениях первого и необработанного исключений создаются как для исключений C ++, так и для любых других исключений, таких как нарушение доступаИсключения не-C ++ могут быть перехвачены блоком __try - __except.

2 голосов
/ 12 июля 2010

Исключением, которое вы пытаетесь отловить, является исключение SEH. Вы можете использовать ключевые слова __try, __except, __finally

1 голос
/ 12 июля 2010

Исключения C ++ обрабатывают только те исключения, которые созданы оператором throw. Они не связаны с машинными исключениями (например, доступ к недействительной памяти). Windows, однако, представила C ++ - схему, подобную исключению, для обработки машинных ошибок, называемую «Структурная обработка исключений». К сожалению, он не очень хорошо подходит для C ++, потому что процесс разматывания стека не вызывает длительных деструкторов.

Итак, они добавили способ сопоставления исключений компьютера с исключением C ++: вы можете предоставить функцию обратного вызова, которая вызывается при возникновении исключения компьютера, и вы можете вызвать исключение C ++ из этого обратного вызова (в отличие от обработчика сигналов) и 1003 *, что исключение используется для размотки стека, на этот раз способом C ++. _set_se_translator () устанавливает этот обратный вызов, и вот соответствующая страница в MSDN:

http://msdn.microsoft.com/en-us/library/5z4bw5h5(VS.80).aspx

1 голос
/ 12 июля 2010

C ++ не определяет проверку границ массива и никогда не имеет. «Ошибка» в этом случае заключается в том, что система во время выполнения сообщает об ошибке сегментации как исключение.

0 голосов
/ 12 июля 2010

При разыменовании нулевого указателя исключение C ++ не возникает, в отличие от Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...