即使在 C# 代码中处理,InvalidOperationException 也会导致 Visual Studio 中断

Posted

技术标签:

【中文标题】即使在 C# 代码中处理,InvalidOperationException 也会导致 Visual Studio 中断【英文标题】:InvalidOperationException causing break in Visual Studio even when handled in C# code 【发布时间】:2017-09-11 18:52:22 【问题描述】:

在我的 C# 应用程序中,我捕获了 SystemException 类型的异常,但在引发异常时 Visual Studio 2015 会中断:

正如您在上面的屏幕截图中看到的,我有意在某些对象初始化之前提前释放ISupportInitialize 锁。我期待异常,并且有一个 catch 块。

另外,我感兴趣的异常没有在异常设置窗口中列出;即它们没有被检查进入中断模式。

虽然对话框显示“抛出此异常时中断”未选中,但应用程序仍会进入中断模式。 编辑:

SLaks 请求的堆栈跟踪:

PresentationCore.dll!System.Windows.Media.GlyphRun.CheckInitialized() 未知 PresentationCore.dll!System.Windows.Media.GlyphRun.ComputeInkBoundingBox() 未知 PresentationCore.dll!System.Windows.Media.BoundsDrawingContextWalker.DrawGlyphRun(System.Windows.Media.Brush foregroundBrush, System.Windows.Media.GlyphRun glyphRun) 未知 PresentationCore.dll!System.Windows.Media.RenderData.DrawingContextWalk(System.Windows.Media.DrawingContextWalker ctx) 未知 PresentationCore.dll!System.Windows.Media.RenderData.GetContentBounds(System.Windows.Media.BoundsDrawingContextWalker ctx) 未知 PresentationCore.dll!System.Windows.UIElement.GetHitTestBounds() 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeContent() 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeRecursive(out System.Windows.Rect bboxSubgraph) 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeRecursive(out System.Windows.Rect bboxSubgraph) 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeRecursive(out System.Windows.Rect bboxSubgraph) 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeRecursive(out System.Windows.Rect bboxSubgraph) 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeRecursive(out System.Windows.Rect bboxSubgraph) 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeRecursive(out System.Windows.Rect bboxSubgraph) 未知 PresentationCore.dll!System.Windows.Media.Visual.PrecomputeRecursive(out System.Windows.Rect bboxSubgraph) 未知 PresentationCore.dll!System.Windows.Media.Visual.Precompute() 未知 PresentationCore.dll!System.Windows.Media.CompositionTarget.System.Windows.Media.ICompositionTarget.Render(bool inResize, System.Windows.Media.Composition.DUCE.Channel 通道) 未知 PresentationCore.dll!System.Windows.Media.MediaContext.Render(System.Windows.Media.ICompositionTarget resizedCompositionTarget) 未知 PresentationCore.dll!System.Windows.Media.MediaContext.RenderMessageHandlerCore(object resizedCompositionTarget) 未知 PresentationCore.dll!System.Windows.Media.MediaContext.RenderMessageHandler(object resizedCompositionTarget) 未知 WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate 回调,对象 args,int numArgs)未知 WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler) 未知 WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeImpl() 未知 WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(对象状态)未知 mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) 未知 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) 未知 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态) 未知 WindowsBase.dll!MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext executionContext, System.Threading.ContextCallback callback, object state) 未知 WindowsBase.dll!System.Windows.Threading.DispatcherOperation.Invoke() 未知 WindowsBase.dll!System.Windows.Threading.Dispatcher.ProcessQueue() 未知 WindowsBase.dll!System.Windows.Threading.Dispatcher.WndProcHook(System.IntPtr hwnd,int msg,System.IntPtr wParam,System.IntPtr lParam,ref bool 处理)未知 WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd,int msg,System.IntPtr wParam,System.IntPtr lParam,ref bool 处理)未知 WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o) 未知 WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate 回调,对象 args,int numArgs)未知 WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler) 未知 WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority 优先级,System.TimeSpan 超时,System.Delegate 方法,对象参数,int numArgs)未知 WindowsBase.dll!MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam) 未知 [本机到托管转换] [托管到本地转换] WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame) 未知 WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame 框架) 未知 PresentationFramework.dll!System.Windows.Application.RunDispatcher(对象忽略)未知 PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window 窗口) 未知 PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window 窗口) 未知 PresentationFramework.dll!System.Windows.Application.Run() 未知 FargoApp.exe!FargoApp.App.Main() 未知 [本机到托管转换] [托管到本地转换] mscorlib.dll!System.AppDomain.ExecuteAssembly(字符串 assemblyFile,System.Security.Policy.Evidence assemblySecurity,string[] args)未知 Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 未知 mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态)未知 mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) 未知 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态, bool preserveSyncCtx) 未知 mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback 回调, 对象状态) 未知 mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() 未知

【问题讨论】:

堆栈跟踪是什么? @SLaks 当我点击 Debug->Windows->Call Stack 时,它只会在面板中显示 [External Code]。 禁用我的代码。 @SLaks 好的,将堆栈跟踪发布为问题的编辑,谢谢。 堆栈跟踪告诉您它根本没有在此代码上崩溃,没有 EndInit() 调用的迹象。从屏幕截图中也可以看出,当前执行的语句没有突出显示。它在尝试渲染时被炸毁,这都是内部代码,所以没什么可看的。或者换一种说法,无效的 EndInit() 调用使视觉树过于不稳定。您捕获并处理了一个无法处理的异常。 【参考方案1】:

您无法捕获异常可能是因为它发生在另一个线程中。对于这种情况,您可以在 App.xaml.cs 中向 DispatcherUnhandledExceptiont 事件添加事件处理程序,如下所示:

DispatcherUnhandledException += (sender, args) =>
            
                Console.WriteLine("Wild exception appeared!!!");
            ;

通过这种方式,您可以确保应用程序抛出但未处理的异常将触发此处理程序。更多信息here

希望这会有所帮助!

【讨论】:

以上是关于即使在 C# 代码中处理,InvalidOperationException 也会导致 Visual Studio 中断的主要内容,如果未能解决你的问题,请参考以下文章

C#阻塞集合处理一个项目两次

C++ 到 C# 事件处理

C#多线程开发-处理异步操作中的异常

C# 如何编写程序监控键盘,即使程序的窗体不是当前活动窗体

如何在 C# 中执行 DragAcceptFiles?

无法复制文件,即使在 C# 中授予了 FileIOPermission