C# 如何抑制/捕获System.ObjectDisposedException?

C# 如何抑制/捕获System.ObjectDisposedException?,c#,.net,C#,.net,我有一个偶尔抛出此异常的应用程序: System.ObjectDisposedException: Cannot access a disposed object. Object name: "Panel". bei System.Windows.Forms.Control.CreateHandle() bei System.Windows.Forms.Control.get_Handle() bei System.Windows.Forms.ContainerContr

我有一个偶尔抛出此异常的应用程序:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: "Panel". 
   bei System.Windows.Forms.Control.CreateHandle() 
   bei System.Windows.Forms.Control.get_Handle() 
   bei System.Windows.Forms.ContainerControl.FocusActiveControlInternal() 
   bei System.Windows.Forms.Form.set_Active(Boolean value) 
   bei System.Windows.Forms.Form.WmActivate(Message& m) 
   bei System.Windows.Forms.Form.WndProc(Message& m) 
   bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
   bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
   bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
有没有一种方法可以在理想情况下抑制此异常而不触及代码?我正在考虑一些注册表魔法或深奥的.NET配置


此外,我当然也对捕捉这种异常的方法感兴趣。我似乎没有办法抓住这个例外。。。当然,它是不可复制的…

运行时试图告诉您一些事情。不要忽视它!捕获并忽略异常并不会使问题消失

特定的异常会告诉您,您正在尝试在面板被释放后使用它。所以这里基本上有两个选项:1)在使用完之前不要公开。2) 处理后不要使用


编辑:为了帮助您解决问题,您可以设置ADPlus为该特定异常创建转储文件。这可以让你了解为什么会发生这种情况。约翰·罗宾斯有一篇关于如何做到这一点的臭虫杀手文章。请看

关于捕获异常;我猜该应用程序中还没有全局异常处理

在Program.cs中:

static void Main()
{
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    Application.Run(new MainForm());
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // Handle exception
    Application.Exit();
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    // Handle exception
    Application.Exit();
}
添加这一点,并优雅地处理异常对用户来说是一件好事。如果您添加一些额外的日志记录,它甚至可以帮助您消除异常的原因。通过检查上述处理程序中的异常类型,可以专门针对
ObjectDisposedException

“有没有一种方法可以治疗我每次射中自己脚时左腿的疼痛?也许是服用大量的扑热息痛或类似药物?”

这里的答案不是解决疼痛,而是避免射中自己的脚

在本例中,有代码访问已释放的面板。这段代码必须是固定的,答案不是抑制异常,因为您的代码中确实存在错误。这里的错误不是运行时

现在,我从评论中看到,你想要一个“快速解决方案”重新开始工作,这种态度不会对你有太长的帮助,因为正如你所看到的,每个答案和可能的解决方案都会带来新的问题


因此,与其花时间让运行时安静下来,告诉您您有一个bug,不如停止这样做并修复bug。

我知道;)理想情况下,我会在代码中优雅地处理此异常。但是(a)目前我不知道如何处理这个问题,(b)快速修复会给我更多的时间进行调查。好吧,如果我当时说的是显而易见的话,那我很抱歉。但是,快速修复可能会导致新的错误。我的建议是花点时间找出问题的根源。这就是我要找的。好啊现在我有了一个全局异常处理程序,但似乎每个
未处理的异常ventargs
我都得到了
IsTerminating
属性。不完全是我所期望的,不是吗?系统计划终止应用程序,因为异常未经处理,因此无法保证应用程序状态正确。当然,您可以选择不在这两个全局处理程序中退出应用程序(通过省略application.exit();),但这有什么好处呢?最后,您可以继续应用程序的唯一时刻是成功处理异常时到示例代码,因为它应该在那里,imho。我在
program.cs
中使用了此代码,但我的应用程序仍然崩溃,出现错误
System.ObjectDisposedException:安全句柄已关闭
。选中StackTrace会使行号0和文件名为空。它不显示任何对象名称