我试图在 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
某个地方处理里面的东西吗?...或者是否有其他(更好的)方法来解决这个问题。
暂时忘记错误的来源(我正处于开发周期的中期,仍在调试),如果能够捕获这些错误并生成一个整洁的小堆栈跟踪,它可以保留在代码中直到部署和让用户知道什么时候出了问题。最终,我会将错误报告包装成可以通过网络报告的内容。