如何跟踪窗体崩溃?就像调用任何事件或调用任何其他事件一样,或者我们可以跟踪窗口窗体是否已崩溃?喜欢dispose被称为窗口形式崩溃。但是其他任何事情都发生了,所以我们可以追踪窗体的崩溃?
类似的问题是我有一个窗口应用程序,主窗体上有教程气球,它对主窗体上的每个控件移动,并通过逐个指示主窗体上的控件来描述应用程序功能。并且每次气球移动气球处理并创建新的气球形式。
现在我想在该气球崩溃时在数据库中插入步骤编号。我无法理解我该怎么办?当气球窗口(窗口形式)崩溃时会发生什么?发生了一次处置事件,但每次气球发生时都会发生这种情况,那么还有其他东西可以跟踪崩溃吗?
编辑:对不起,我忘了指出它是.net framework 2.0。答案 0 :(得分:4)
使用此:http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx
如果表单线程中发生任何未处理的异常,它将到达此处。如果它为null,则会得到通常的对话框(发生未处理的异常,您可以继续或关闭,并查看堆栈跟踪)。
答案 1 :(得分:3)
这是我的一个小型Windows Forms 2.0程序的摘录:
[STAThread]
private static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException +=
applicationThreadException;
// Set the unhandled exception mode to force all Windows Forms
// errors to go through our handler.
Application.SetUnhandledExceptionMode(
UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException +=
currentDomainUnhandledException;
...
}
使用两个处理程序
private static void currentDomainUnhandledException(
object sender,
UnhandledExceptionEventArgs e)
{
handleException(e.ExceptionObject as Exception);
}
和
private static void applicationThreadException(
object sender,
ThreadExceptionEventArgs e)
{
handleException(e.Exception);
}
在我的例子中,处理异常的实际功能是:
private static void handleException(
Exception exception)
{
LogCentral.Current.LogError(
@"Exception occurred.",
exception);
if (ErrorForm.IsErrorFormShowing)
{
LogCentral.Current.LogInfo(
@"Error form already showing, not showing again.",
exception);
}
else
{
using (var form = new ErrorForm(exception))
{
var result = form.ShowDialog();
if (result == DialogResult.Abort)
{
Application.Exit();
}
}
}
}
即。它通过log4net记录错误,然后显示错误表单以向用户显示更多信息(异常消息)并允许退出应用程序。
答案 2 :(得分:1)
在Program.cs文件中,在Main()函数中放置一个try / catch块。我们的想法是将Application.Run( yourformhere )放在这样的块中。然后在catch中你可以设法在DB中保存一些状态(比如气球撞击表单的步骤)。祝你好运!