如何跟踪窗体的崩溃?

时间:2011-01-03 11:52:05

标签: c# winforms

如何跟踪窗体崩溃?就像调用任何事件或调用任何其他事件一样,或者我们可以跟踪窗口窗体是否已崩溃?喜欢dispose被称为窗口形式崩溃。但是其他任何事情都发生了,所以我们可以追踪窗体的崩溃?

类似的问题是我有一个窗口应用程序,主窗体上有教程气球,它对主窗体上的每个控件移动,并通过逐个指示主窗体上的控件来描述应用程序功能。并且每次气球移动气球处理并创建新的气球形式。

现在我想在该气球崩溃时在数据库中插入步骤编号。我无法理解我该怎么办?当气球窗口(窗口形式)崩溃时会发生什么?发生了一次处置事件,但每次气球发生时都会发生这种情况,那么还有其他东西可以跟踪崩溃吗?

编辑:对不起,我忘了指出它是.net framework 2.0。

3 个答案:

答案 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中保存一些状态(比如气球撞击表单的步骤)。祝你好运!