Я пытаюсь уловить любые и все исключения в приложении С++/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
?... или есть какой-то другой (лучший) способ обойти это.
Забыв источник ошибки на мгновение (я занимаюсь средним циклом разработки и все еще отлаживаю), было бы неплохо уловить эти ошибки и создать аккуратную небольшую трассировку стека, которая могла бы оставаться в коде прямо вверх для развертывания и позволить пользователям узнать, когда все идет не так. В конце концов я бы обернул отчет об ошибке в сообщение, которое могло бы сообщать через Интернет.