【发布时间】: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