ловить неизвестное исключение - PullRequest
6 голосов
/ 08 июля 2011

В версии релиза моего кода одна строка выдает исключение, и я не знаю, что это за тип исключения, поэтому я не могу его правильно перехватить или выяснить проблему.

Я используюподвох (...), но это в значительной степени бесполезно.

вот какой-то псевдокод

 try
  {
    m_mmwIPC = gcnew NiftyIPC(gcnew String("Monitor"), true);
  }
  catch (CException* e)
  {
    TCHAR   szCause[255];
    e->GetErrorMessage(szCause, 255);
    CString errorStr = szCause;
    RemoveLineFeeds(errorStr);
    OutputDebugString(errorStr);
  }
  catch(...)
  {
    OutputDebugString(L"Unknown exception\n");
  }

Итак, есть ли способ получить какие-либо подробности о выброшенном неизвестном исключении?Просто тип был бы великолепен.

спасибо

Ответы [ 5 ]

6 голосов
/ 08 июля 2011

Не совсем, это может быть int, const char* или RhubarbPie über-smart указатель.

Тем не менее:

  • Попробуйте тоже поймать std::exception. Это поймает много собственных исключений C ++.
  • Вероятно, ваше исключение относится к .NET, поэтому попытайтесь его отловить, а не исключение MFC Base. (Похоже, вы работаете с C ++ / CLI. В этом случае исключения .NET заканчиваются предложением catch-all)
  • Кроме того, исключения обычно предназначены для отсылки по ссылке в C ++. ( Обновление: MFC, очевидно, использует бросок-и-ловлю по указателю. Это также работает, если вы ловите то, что брошено. )
  • Также может помочь использование __try и __catch, поскольку некоторые «аппаратные» исключения, такие как переполнение стека, нарушение доступа и т. Д., Также являются неизвестными исключениями в Windows. Синтаксис их перехвата немного отличается, но вы получаете идентификатор исключения, который можно использовать для сообщения о типе выданного исключения. Я использую это для печати трассировки стека при фатальных ошибках в наших приложениях.
1 голос
/ 08 июля 2011

Каждое исключение должно происходить из std::exception, тогда вы можете использовать RTTI.Стандартный блок catch:

catch (const std :: exception & e) {
    // e .what ();
    // typeid (e);
}
catch (...) {
    // WTF ?!?!?
}

В c ++ 0x вы можете использовать std::current_exception и, возможно, передать exception_ptr в какую-нибудь умную библиотеку для анализа.

Помните, что исключениябыть buildins и другими типами, которые не имеют RTTI, поэтому вы всегда должны наследовать от std :: exception.

1 голос
/ 08 июля 2011

Поскольку вы указываете использование MFC, я сделаю предположение, что вы работаете с версией Visual Studio. Если это так, и вы можете запустить свою программу в режиме отладки, то вы можете настроить отладчик на прерывание необработанных исключений. Для этого потребуется удалить часть кода catch(...), но он должен ворваться в отладчик в правильной точке и предоставить вам полезную информацию о самом исключении.

Я отсылаю вас к документации Microsoft здесь и здесь .

0 голосов
/ 08 июля 2011

Один из вариантов - , а не , перехватить ошибку и запустить программист в отладчике (это возможно в режиме Release).Visual Studio взломает код, в котором возникает необработанное исключение.

0 голосов
/ 08 июля 2011

Нет, здесь нет. catch (...) должен использоваться только как последнее средство.

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