【问题标题】:Multithread Exception handling多线程异常处理
【发布时间】:2014-03-23 05:06:31
【问题描述】:

这是一个简单的程序:

class Program
{
    static Calc calc = new Calc();

    static void Main(string[] args)
    {
        try
        {
            var t1 = new Thread(calc.Divide);
            t1.Start();
        }
        catch (DivideByZeroException e)
        {
            //Console.WriteLine("Error thread: " + e.Message);
        }

        try
        {
            calc.Divide();
        }
        catch (Exception e)
        {
            //Console.WriteLine("Error calc: " + e.Message);
        }

    }

    class Calc
    {
        public int Num1;
        public int Num2;

        Random random = new Random();

        public void Divide()
        {
            for (int i = 0; i < 100000; i++)
            {
                Num1 = random.Next(1, 10);
                Num2 = random.Next(1, 10);

                try
                {
                    int result = Num1 / Num2;
                }
                catch (Exception ex)
                {
                    throw ex;
                }

                Num1 = 0;
                Num2 = 0;
            }
        }
    }
}

两个线程同时执行相同的方法。其中一个将 Num1 设置为 0,而另一个试图同时除以 Num1 (0)。问题是为什么会抛出异常,为什么 Main 方法中的 try catch 块没有捕捉到它?

【问题讨论】:

  • 异常不会从一个线程冒泡到启动它的线程。甚至可能无法保证启动引发异常的线程的原始线程甚至还活着。
  • 另外,请注意,IDE 有时会(取决于设置)在发生异常时停止,即使它被捕获(在这种情况下它不会被第一个 catch 捕获)。
  • throw ex; 始终是a bad pattern
  • TPL 的一个(重要的)特性是捕获和编组调用者的异常。裸线程不会这样做。

标签: c# multithreading exception-handling


【解决方案1】:

主线程是一个线程,而您的新线程是另一个线程。这两个线程不相互交谈,这意味着它们是完全独立的。如果您想在主线程上捕获异常,有两种方法

  1. 使用 backgroundworker 类,RunWorkerCompleted 事件将在主线程上触发,e.exception 会告诉您是否有异常导致线程中止。

  2. 使用全局捕手

在代码前添加这一行

Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;

void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//handle the exception
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多