Neither Application.ThreadException nor AppDomain.CurrentDomain.UnhandledException are respected

怎甘沉沦 提交于 2019-12-11 23:13:49

问题


First, within the Program.Program() static constructor I have this code:

AppDomain.CurrentDomain.UnhandledException += (s, eargs) =>
    LogException((Exception)eargs.ExceptionObject);
Application.ThreadException +=
    (s, eargs) => LogException(eargs.Exception);

Then, if I deliberately do (for example) a divide-by-zero, it's caught. However, none of the other exceptions from within the thread loop are caught, like this one - its stack trace is:

System.ComponentModel.ReflectPropertyDescriptor.GetValue(component = {My.Component})    
System.Windows.Forms.BindToObject.GetValue()    
System.Windows.Forms.Binding.PushData(force)    
System.Windows.Forms.Binding.UpdateIsBinding()  
System.Windows.Forms.Binding.CheckBinding() 
System.Windows.Forms.Binding.SetListManager(bindingManagerBase) 
System.Windows.Forms.ListManagerBindingsCollection.AddCore(dataBinding = {System.Windows.Forms.Binding})    
System.Windows.Forms.BindingsCollection.Add(binding)    
System.Windows.Forms.BindingContext.UpdateBinding(newBindingContext, binding)   
System.Windows.Forms.Control.UpdateBindings()   
System.Windows.Forms.Control.OnBindingContextChanged(e = {System.EventArgs})    
System.Windows.Forms.Control.OnParentBindingContextChanged(e)   
System.Windows.Forms.Control.OnBindingContextChanged(e = {System.EventArgs})    
System.Windows.Forms.Control.OnParentBindingContextChanged(e)   
System.Windows.Forms.Control.OnBindingContextChanged(e = {System.EventArgs})    
System.Windows.Forms.Control.OnParentBindingContextChanged(e)   
System.Windows.Forms.Control.OnBindingContextChanged(e = {System.EventArgs})    
System.Windows.Forms.Control.OnParentBindingContextChanged(e)   
System.Windows.Forms.Control.OnBindingContextChanged(e = {System.EventArgs})    
System.Windows.Forms.Control.CreateControl()    
System.Windows.Forms.Control.SetVisibleCore(value = true)   
System.Windows.Forms.TabPage.Visible.set(value) 
System.Windows.Forms.TabControl.UpdateTabSelection(updateFocus = false) 
System.Windows.Forms.TabControl.OnHandleCreated(e)  
System.Windows.Forms.Control.WmCreate(m)    
System.Windows.Forms.Control.WndProc(m) 
System.Windows.Forms.TabControl.WndProc(m)  
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(m)   
System.Windows.Forms.Control.ControlNativeWindow.WndProc(m) 
System.Windows.Forms.NativeWindow.Callback(hWnd, msg = 0x00000001, wparam, lparam)  
[Native to Managed Transition]  
[Managed to Native Transition]  
System.Windows.Forms.UnsafeNativeMethods.CreateWindowEx(dwExStyle, lpszClassName, lpszWindowName, style, x, y, width, height, hWndParent, hMenu, hInst, pvParam)    
System.Windows.Forms.NativeWindow.CreateHandle(cp)  
System.Windows.Forms.Control.CreateHandle() 
System.Windows.Forms.TabControl.CreateHandle()  
System.Windows.Forms.Control.CreateControl(fIgnoreVisible = false)  
System.Windows.Forms.Control.CreateControl(fIgnoreVisible = false)  
System.Windows.Forms.Control.CreateControl(fIgnoreVisible = false)  
System.Windows.Forms.Control.CreateControl(fIgnoreVisible = false)  
System.Windows.Forms.Control.CreateControl()    
System.Windows.Forms.Control.WmShowWindow(m)    
System.Windows.Forms.Control.WndProc(m) 
System.Windows.Forms.ScrollableControl.WndProc(m)   
System.Windows.Forms.ContainerControl.WndProc(m)    
System.Windows.Forms.Form.WmShowWindow(m)   
System.Windows.Forms.Form.WndProc(m)    
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(m)   
System.Windows.Forms.Control.ControlNativeWindow.WndProc(m) 
System.Windows.Forms.NativeWindow.Callback(hWnd, msg = 0x00000018, wparam, lparam)  
[Native to Managed Transition]  
[Managed to Native Transition]  
System.Windows.Forms.Control.SetVisibleCore(value = true)   
System.Windows.Forms.Form.SetVisibleCore(value = true)  
System.Windows.Forms.Control.Visible.set(value) 
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(reason = 0xffffffff, context = {System.Windows.Forms.ApplicationContext})    
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(reason, context)  
System.Windows.Forms.Application.Run(mainForm)  
My.Namespace.Program.Main()
[Native to Managed Transition]  
[Managed to Native Transition]  
System.AppDomain.ExecuteAssembly(assemblyFile, assemblySecurity, args)  
Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()   
System.Threading.ThreadHelper.ThreadStart_Context(state)    
System.Threading.ExecutionContext.Run(executionContext, callback, state)    
System.Threading.ThreadHelper.ThreadStart() 

When that ReflectPropertyDescriptor calls my code and I throw a custom exception, the system silently swallows it and I can't log it.


回答1:


It turns out that the majority of my lost exceptions can be seen in the BindingComplete event. It'll have to do.



来源:https://stackoverflow.com/questions/6796273/neither-application-threadexception-nor-appdomain-currentdomain-unhandledexcepti

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!