这是一个简单的程序:
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块捕获?
答案 0 :(得分:0)
主线程是一个线程,你的新线程是另一个线程。这两个线程不相互通信意味着它们完全独立。如果你想在主线程上捕获异常,有两种方法可以做到这一点
使用backgroundworker类,RunWorkerCompleted事件将在主线程上触发,e.exception将告诉您是否有异常导致线程被中止。
使用全局捕手
在代码
之前添加此行Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
和
void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
//handle the exception
}