要想在主线程捕获其他线程异常,需阻塞主线程,等所有线程执行结束,方可捕获异常;
否则无法捕获异常;
下面这种方式,线程抛出异常,代码走不进catch,catch无法捕获异常
static void GetThreadException1()
{
try
{
Task.Run(() =>
{
Console.WriteLine("dosomething");
throw new Exception("test exception");
});
Task.Run(() => Console.WriteLine("dosomething else"));
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
下面这种,catch可以捕获到线程异常信息
static void GetThreadException2()
{
try
{
var taskList = new List<Task>();
taskList.Add( Task.Run(() =>
{
Console.WriteLine("dosomething");
throw new Exception("test exception");
}));
taskList.Add( Task.Run(() => Console.WriteLine("dosomething else")));
Task.WaitAll(taskList.ToArray());
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}