Я пытаюсь перехватить все исключения в приложении C ++ / CLI, чтобы я мог их регистрировать и записывать (включая трассировку стека). Пока у меня есть код, который выглядел многообещающе:
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
// Enabling Windows XP visual effects before any controls are created
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// Create the main window and run it
try
{
Application::Run(gcnew MainForm());
}
catch( System::Exception^ e )
{
String^ message = gcnew String("");
System::Exception^ exceptionRecursor = e;
message = "ERROR: Uncaught exception encountered!\n\n";
while( exceptionRecursor )
{
message += exceptionRecursor->Source+"\n\t";
message += exceptionRecursor->Message+"\n\t";
message += exceptionRecursor->StackTrace+"\n\n";
exceptionRecursor = exceptionRecursor->InnerException;
}
MessageBox::Show(message);
}
return 0;
}
... но вместо того, чтобы отключить диалоговое окно с моими исправленными ошибками, я получаю что-то еще:
An unhandled exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
Additional information: Exception has been thrown by the target of an invocation.
Это потому, что команда Run
каким-то образом пытается обработать исключение? Нужно ли где-то обрабатывать вещи внутри MainForm
? ... или есть какой-то другой (лучший) способ добиться этого.
Забыв на мгновение источник ошибки (я нахожусь в середине цикла разработки и все еще отлаживаю), было бы неплохо иметь возможность отлавливать эти ошибки и производить аккуратную небольшую трассировку стека, которая может остаться в коде до к развертыванию и дайте пользователям знать, когда что-то идет не так. В конце концов я бы обернул сообщение об ошибке во что-то, что можно было бы передать через Интернет.