0

我想处理Progress班级中所有未处理的异常,我在其中编写了一些用于错误记录的代码:

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 LoginPoint());
        }
        catch (Exception myException)
        {
            //log the unhandled exceptions.                
        }
    }
}

BackgroundWorker但是没有正确处理中的异常:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker worker = sender as BackgroundWorker;
    throw new Exception("TEST EXCEPTION!");
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        throw new Exception("I GOT THE EXCEPTION");
    }
}

我希望在我的班级中处理异常“我得到...”Progress,但是当我运行(而不是调试)应用程序时会出现系统的异常对话框。

4

3 回答 3

2

您可以使用 AppDomain.UnhandledException 事件

于 2013-04-18T14:33:05.613 回答
1

在 program.cs 中这样做:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
    Application.Run(new Form1());
}

static void AppDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
{
    MessageBox.Show(((Exception)e.ExceptionObject).Message, "AppDomain.UnhandledException");
    Environment.Exit(-1);
}

您的表单代码应该可以使用它,并且您应该AppDomain.UnhandledException在运行模式下获得 MessageBox (ctrl+F5)

于 2013-04-18T13:26:03.530 回答
0

我的方法可能是事件处理程序。您面临的问题是跨线程通信,这是一个臭名昭著的无赖!您应该研究线程并调用以了解更多信息。但是,您可以使用事件和事件处理程序在工作线程和主线程之间进行安全通信。这是一个简短的例子:

public delegate void ExceptionHandler(Exception ex);

public class Worker : BackgroundWorker
{
    ExceptionHandler Handler { get; set; }

    public Worker(ExceptionHandler handler)
    {
        Handler = handler;
    }

    protected override void OnDoWork(DoWorkEventArgs e)
    {
        for (var i = 0; i < (int)e.Argument; i++)
        {
            if (i%2 != 0) continue;

            try
            {
                throw new ArgumentException(String.Format("{0}:{1}", i, "TEST EXCEPTION"));
            }
            catch (Exception ex)
            {
                if (this.Handler != null)
                    Handler.Invoke(ex);
            }
        }
    }
}

class Program
{
    public static void HandleException(Exception ex)
    {
        Console.WriteLine(ex.Message);
    }

    static event ExceptionHandler Handler;

    static void Main(string[] args)
    {
        Handler = new ExceptionHandler(HandleException);
        var worker = new Worker(Handler);
        worker.RunWorkerAsync(100);

        Console.ReadLine();
    }
}

控制台窗口中的预期输出将是:

0:TEST EXCEPTION
2:TEST EXCEPTION
4:TEST EXCEPTION
6:TEST EXCEPTION
etc etc

希望这对您有所帮助,即使这不是您要寻找的答案,也希望它能以某种方式帮助您。

于 2013-04-18T14:41:04.863 回答