如何压缩/捕获System.ObjectDisposedException?

时间:2009-10-23 08:07:17

标签: 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.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配置。

此外,我当然也对捕获此异常的方法感兴趣。似乎没有钩子让我抓住这个例外...当然它不可重现......

3 个答案:

答案 0 :(得分:6)

“有没有办法解决我每次用脚射击自己的左腿疼痛?可能服用大量扑热息痛或类似物?”

这里的答案不是解决疼痛,而是避免自己在脚下射击。

在这种情况下,有代码访问处理的面板。必须修复此代码,答案不是要抑制异常,因为您确实在代码中有错误。这不是运行时故障。

现在,我从评论中看到你想要“快速修复”以恢复工作,这种态度不会长期帮助你,因为正如你所看到的,每个答案和可能的解决方案都带来了新的问题。

因此,不要花时间试图让运行时保持沉默,告诉您有错误,而是停止这样做并修复错误。

答案 1 :(得分:5)

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

具体的例外情况告诉您,在处理完Panel后,您正尝试使用它。所以你基本上有两个选择:1)在你完成使用之前不要暴露。 2)处理后请勿使用。

编辑:为了帮助您解决问题,您可以设置ADPlus以为该特定异常创建转储文件。这可以让您了解为什么会发生这种情况。 John Robbins有一篇关于如何做到这一点的Bugslayer文章。请参阅http://msdn.microsoft.com/en-us/magazine/cc163530.aspx

答案 2 :(得分:3)

关于捕获异常;我猜这个应用程序中没有全局异常处理了吗?

在您的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