Exception 混合本机/托管可执行文件中的最终托管异常处理程序?
我有一个使用/clr编译的MFC应用程序,我正在尝试为未捕获的托管异常实现最终的处理程序。对于本机异常,重写Exception 混合本机/托管可执行文件中的最终托管异常处理程序?,exception,executable,mixed,unhandled,Exception,Executable,Mixed,Unhandled,我有一个使用/clr编译的MFC应用程序,我正在尝试为未捕获的托管异常实现最终的处理程序。对于本机异常,重写CWinApp::processwndproception有效 Jeff的Application.ThreadException和AppDomain.CurrentDomain.UnhandleException中建议的两个事件未引发 有人能建议一种为混合可执行文件提供最终托管异常处理程序的方法吗 更新: 这些异常处理程序似乎只在应用程序的下游触发。运行或类似程序(有工作线程风格,不记得
CWinApp::processwndproception
有效
Jeff的Application.ThreadException
和AppDomain.CurrentDomain.UnhandleException
中建议的两个事件未引发
有人能建议一种为混合可执行文件提供最终托管异常处理程序的方法吗
更新: 这些异常处理程序似乎只在
应用程序的下游触发。运行或类似程序(有工作线程风格,不记得名称)。如果要真正全局捕获托管异常,则需要安装SEH筛选器。你不会得到一个System.Exception
,如果你想要一个callstack,你就必须使用自己的walker
在MSDN论坛关于这个主题的一个问题中,有人建议在try中覆盖主MFC线程的一个足够低级别的点。。。捕获(异常^)
。例如,CWinApp::Run
。这可能是一个很好的解决方案,但我还没有考虑任何性能或稳定性方面的影响。在退出之前,您将有机会使用调用堆栈登录,并且可以避免默认的windows未解析异常行为。使用这两个异常处理程序应该可以工作。您确定您已经将它们添加到了将要调用和正确设置它们的位置(即,在您的应用程序的托管入口点——您确实在其中添加了一个,对吗?)
使用这两个异常处理程序应该可以工作
为什么“应该?”
不使用以下方法引发事件:
extern "C" void wWinMainCRTStartup();
// managed entry point
[System::STAThread]
int managedEntry( void )
{
FinalExceptionHandler^ handler = gcnew FinalExceptionHandler();
Application::ThreadException += gcnew System::Threading::ThreadExceptionEventHandler(
handler,
&FinalExceptionHandler::OnThreadException);
AppDomain::CurrentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(
handler,
&FinalExceptionHandler::OnAppDomainException);
wWinMainCRTStartup();
return 0;
}
// final thread exception handler implementation
void FinalExceptionHandler::OnThreadException( Object^ /* sender */, System::Threading::ThreadExceptionEventArgs^ t )
{
LogWrapper::log->Error( "Unhandled managed thread exception.", t->Exception );
}
// final appdomain exception handler implementation
void FinalExceptionHandler::OnAppDomainException(System::Object ^, UnhandledExceptionEventArgs ^args)
{
LogWrapper::log->Error( "Unhandled managed appdomain exception.", (Exception^)(args->ExceptionObject) );
}
BOOL CMyApp::InitInstance()
{
throw gcnew Exception("test unhandled");
return TRUE;
}
环顾一下Internet,您会发现您需要安装一个过滤器,以使非托管异常在到达AppDomain的过程中通过过滤器。发件人:
CLR依靠SEH未处理异常筛选器机制捕获未处理的异常
也许这有助于我们进一步了解您提到的两个事件没有捕获到的正在抛出的异常?任何托管异常-System::exception的任何继承者。上述事件的要点是在/any/managed异常未捕获时触发。我认为问题在于没有应用程序。在任何地方运行。