2014-02-21 211 views
3

这里有一个简单的程序:多线程异常处理

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块捕获?

enter image description here

+3

异常不泡从一个线程的线程开始之前加入这行。甚至可能没有保证启动抛出异常的那个原始线程已经存在了。 – vcsjones

+0

另外,请注意,IDE有时(取决于设置)在发生异常时即使发生异常也会停止(而不是在此情况下会被第一个“catch”捕获)。 –

+0

'throw ex;'总是[坏模式](http://stackoverflow.com/a/4553119/60761)。 –

回答

0

主线程是一个线程,新线程是另一个线程。这两个线程并不互相通信,这意味着它们完全独立。如果你想捕捉到了异常的主线程有做

  1. 使用一个BackgroundWorker类的两种方式,RunWorkerCompleted事件将在主线程被解雇,e.exception会告诉你,如果有异常所致该线程被中止。

  2. 使用全局捕手

你的代码

Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException; 

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