Я рекомендую вам попробовать __try / __except
__try
{
Application::Run(gcnew frmMain());
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
LogAndExit(new Exception("Some Unmanage exception"));
}
Документация MSDN здесь:
http://msdn.microsoft.com/en-us/library/s58ftw19(v=vs.80).aspx
Если вы хотите стать действительно хитрым, вы можете попробовать дважды обернуть его так:
__try
{
try {
Application::Run(gcnew frmMain());
}
catch(SEHException^ e)
{
LogAndExit(new Exception("Some Unmanage exception"));
}
catch(...) //Leave this out if you're /clr:pure
{
LogAndExit(new Exception("Some Unmanage exception"));
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
LogAndExit(new Exception("Some Unmanage exception"));
}
Структурированные исключения включаются в SEHException ^ обычно.
Вам также необходимо принять во внимание, что на самом деле вы можете перехватывать исключение, но что-то в вашем методе LogAndExit вызывает вторичное исключение, которое фактически завершает вашу программу. Попробуйте заглушить функцию LogAndExit и посмотрите, сможете ли вы заставить аварийный сбой произойти тихо, а не с помощью стандартного сообщения об отмене, и / или оберните свой код LogAndExit в другой try / catch, который скрывает любые исключения.
Как человек, который уделил много времени C ++ / CLI, я могу сочувствовать вашей дилемме. Надеюсь, что это решение поможет.
Дополнительная документация MSDN по обработке исключений в C ++ / CLI:
Как: определить и установить глобальный обработчик исключений
http://msdn.microsoft.com/en-us/library/171ezxzc.aspx
Обработка исключений в / clr
http://msdn.microsoft.com/en-us/library/633chdda.aspx