从IDE调试项目时捕获异常,但在IDE外部运行则不会捕获异常

时间:2010-06-30 07:31:39

标签: c# .net winforms exception-handling

在C#,WinForms,VS2008,.NET 3.5 ......

对于此代码:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormThatDividesByZero());
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

    }
}

public partial class FormThatDividesByZero : Form
{
    public FormThatDividesByZero()
    {
        InitializeComponent();
    }

    private void DivideByZeroButton_Click(object sender, EventArgs e)
    {
        // Create a divide by zero exception.
        int a = 0;
        int b = 0;
        int c = a / b;
    }
}

完整来源:http://forgefx.com/posts/ExceptionReporting.zip

当我从开发环境通过F5运行这个小测试项目时,会发现点击DivideByZero按钮后的异常并触发消息框。当我通过双击/ bin / Debug文件夹中的.exe运行项目时,没有捕获到异常并且没有消息框 - 为什么会出现这种情况?

当从IDE外部启动.exe,或者从visual studio中启动“Debug&gt; Start Without Debugging”时,我得到一个未处理的异常。我的理解是上面的代码会捕获所有异常。

2 个答案:

答案 0 :(得分:1)

这不是捕获全局异常的好方法。您可以使用AppDomain或Application对象来捕获它。该对象捕获所有未处理的异常和调用事件。

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {

            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormThatDividesByZero());            

    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Exception ex = (Exception)e.ExceptionObject;
        MessageDialog.Show(ex.Message);
        Application.Exit();
    }

    void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        MessageDialog.Show(e.Exception.Message);
    }
}



public partial class FormThatDividesByZero : Form
{
    public FormThatDividesByZero()
    {
        InitializeComponent();
    }

    private void DivideByZeroButton_Click(object sender, EventArgs e)
    {
        // Create a divide by zero exception.
        int a = 0;
        int b = 0;
        int c = a / b;
    }
}

答案 1 :(得分:0)

尝试为Application.ThreadException事件添加事件处理程序。

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    MessageBox.Show("ThreadException:"+e.Exception.Message);
}

void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { MessageBox.Show("ThreadException:"+e.Exception.Message); }

通过这种方式,您可以在不结束应用程序的情况下处理任何事件代码中的未捕获异常,例如通过记录或警告。当然,在需要考虑这种意外异常后,应用程序是否仍然稳定,即应用程序继续运行是否有意义?