1

В некоторых VC++ блока кода я получаю следующий первый шанс исключение -Поймайте первый шанс исключение попытаться поймать блок с помощью VC++

первого шанса исключение в 0x77e4bef7 в MYAPP.EXE: Microsoft C исключение ++: ComUtil :: ComError в ячейке памяти 0x0013ee04 ..

Я вижу вышеупомянутое исключение в окне вывода Visual studio. Как я могу поймать это исключение. Я использую Visual Studio 2008 для разработки.

+0

Вы уверены, что хотите его поймать? http://blogs.msdn.com/b/davidklinems/archive/2005/07/12/438061.aspx – CompuChip

+0

На самом деле, в приложении во время отладки появляется много исключений ошибок com memory, позже из-за этого приложения сбоев и блокировок Visual Studio. Поэтому я хочу поймать эти исключения. – nvivekgoyal

+0

Проблема в том, что они уже пойманы - это то, что означает исключение первого шанса. Вы можете попробовать подключить профилировщик или что-то вроде VLD (Visual Leak Detector), чтобы узнать источник утечек. – CompuChip

ответ

5

Это просто уведомление отладчика и ничего не означает ничего. Вы поймаете исключение, как обычно, просто попробуйте/поймайте. Вы хотите catch (_com_error& ex) в этом случае, он сообщает вам, почему ваш вызов метода COM не удался.

Исключения «Первая случайность» полезны, потому что вы можете попросить отладчика остановиться при возникновении исключения. Который позволяет найти почему его выбрасывают. Вы используете Debug + Exceptions, установите флажок «Бросок» для исключений C++. Не очень интересно в случае исключений _com_error, вы увидите только автоматическую сгенерированную оболочку из директивы #import. Если вы не хотите видеть шум уведомления, просто щелкните правой кнопкой мыши окно «Выход» и отключите «Исключительные сообщения».

+0

Спасибо, что ответили на мой вопрос. Я хочу спросить, можно ли разрешить это первое исключение? Нужно ли мне обновлять код VC++, чтобы решить эту проблему? – nvivekgoyal

+1

Вам нужно * исправить * свой код. Вы вызываете вызов метода COM, и он возвращает сбой HRESULT. Что отображается в исключение _com_error, поэтому вы не можете игнорировать ошибку. Используйте члены класса _com_error для диагностики причины. Метод Error() возвращает HRESULT, метод Description() возвращает строку, описывающую ошибку. Никогда не избегайте обработки ошибок при использовании COM. Методы могут и * сделать * терпят неудачу. Обычно очень рано, когда вы начинаете писать код, потому что сервер установлен неправильно. –

+0

Спасибо! При дальнейших исследованиях в коде я обнаружил, что код не может открыть раздел реестра. Следовательно, исключение выдается из кода, используя следующий код - throw ComUtil :: ComError (description, hr); Первое случайное исключение бросается на выполнение этой строки. Позже ошибка Com будет выбрана в блоке catch и будет зарегистрировано правильное сообщение. Я хочу, чтобы это первое исключение исключений было подавлено, в то время как ошибка Com выбрана в блоке catch как обычно. Как я могу это сделать? Нужно ли мне удалять ключевое слово throw? – nvivekgoyal

Смежные вопросы