如何避免错误消息窗口

时间:2011-10-03 08:02:45

标签: c#

我们在服务器实例上有一个应用程序并且很少,但是我们有内存不足的例外(程序没有泄漏,只是实例非常小并且它运行时有相当大的数据)。

这不是问题,因为我们监视该服务器实例上的进程,如果在进程列表中找不到某些进程,则会发送警报电子邮件。

现在问题在于:

enter image description here

这可以防止进程从进程列表中消失,因此我们不会收到关于它失败的警报电子邮件。是否可以禁用此消息,如果程序在我们未捕获的内容上失败,它将在没有用户交互的情况下关闭?

4 个答案:

答案 0 :(得分:2)

不知道你是否可以停用它 - 但我认为你不应该。 找到应用程序中的错误/问题,并通过关闭或在第一种情况下防止问题来处理问题。 其他一切都将是一个真正的原始解决方案,我不认为你的客户会很高兴有这样的行为(毕竟不会有数据丢失?如果不是这总是错误/没有完成触摸)

答案 1 :(得分:1)

您可以在程序中放置一个全局try / catch块,并在任何意外异常时退出该程序。

答案 2 :(得分:1)

如果使用WPF,您可以尝试在app.xaml.cs中捕获以下两个例外情况。可能还有其他/补充异常要处理,但这是我通常要寻找的两个:

  

AppDomain.CurrentDomain.UnhandledException - “此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。如果有关状态的充分信息如果应用程序可用,则可以执行其他操作 - 例如保存程序数据以供以后恢复。建议小心,因为在未处理异常时程序数据可能会损坏。“

     

Dispatcher.UnhandledException - “在通过Invoke或BeginInvoke执行委托期间抛出和未捕获线程异常时发生。”

即:

public partial class App : Application
{
public App()
{
    this.Dispatcher.UnhandledException += DispatcherUnhandledException;
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
}

private void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    // log and close gracefully
}


private new void DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    e.Handled = true;
    // log and close gracefully
}
}

答案 3 :(得分:1)

假设Windows窗体,我通常会执行多个步骤来阻止此消息框。

首先,我在Main函数中连接了几个处理程序:

[STAThread]
private static void Main()
{
    Application.ThreadException +=
        application_ThreadException;

    Application.SetUnhandledExceptionMode(
        UnhandledExceptionMode.CatchException);

    AppDomain.CurrentDomain.UnhandledException +=
        currentDomain_UnhandledException;

    Application.Run(new MainForm());
}

当发生其他未处理的异常时,将调用这些处理程序。我会定义类似的东西:

private static void application_ThreadException(
    object sender,
    ThreadExceptionEventArgs e)
{
    doHandleException(e.Exception);
}

private static void currentDomain_UnhandledException(
    object sender,
    UnhandledExceptionEventArgs e)
{
    doHandleException(e.ExceptionObject as Exception);
}

然后调用的实际doHandleException函数执行实际的错误处理。通常这是记录错误并通知用户,为他提供继续申请或退出申请的选项。

来自实际应用程序的示例如下:

private static void doHandleException(
    Exception e)
{
    try
    {
        Log.Instance.ErrorException(@"Exception.", e);
    }
    catch (Exception x)
    {
        Trace.WriteLine(string.Format(
                @"Error during exception logging: '{0}'.", x.Message));
    }

    var form = Form.ActiveForm;
    if (form == null)
    {
        MessageBox.Show(buildMessage(e), 
                "MyApp", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    else
    {
        MessageBox.Show(form, buildMessage(e), 
                "MyApp", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

使用辅助函数:

public static string buildMessage(Exception exception)
{
    var result = new StringBuilder();

    while (exception != null)
    {
        result.AppendLine(exception.Message);
        result.AppendLine();
        exception = exception.InnerException;
    }

    return result.ToString().Trim();
}

如果您使用的不是Windows窗体,例如在控制台应用程序或WPF中,某些处理程序不存在,而其他处理程序则存在。

这个想法保持不变:如果您的代码块周围没有try...catch,请订阅正在调用的事件处理程序。

就个人而言,我尝试尽可能少地使用try...catch块(理想情况下没有)。