我有一个偶尔抛出此异常的应用程序:
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配置。
此外,我当然也对捕获此异常的方法感兴趣。似乎没有钩子让我抓住这个例外...当然它不可重现......
答案 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
。