最簡單的方式spa
var t = new Task(() => { throw new Exception("unknow excption"); }); t.Start(); try { t.Wait(); } catch (AggregateException e) { foreach (var item in e.InnerExceptions) { Console.WriteLine("異常類型\t{0}\n來自\t{1}\n異常內容\t{2}", item.GetType(), item.Source, item.Message); } }
缺點:這個會阻塞當前線程。下面是改進版線程
var t = new Task(() => { throw new Exception("unknow excption"); }); t.Start(); var cat = t.ContinueWith(task => { foreach (var item in task.Exception.InnerExceptions) { Console.WriteLine("異常類型\t{0}\n來自\t{1}\n異常內容\t{2}", item.GetType(), item.Source, item.Message); } }, TaskContinuationOptions.OnlyOnFaulted); //指定只應在延續任務前面的任務引起了未處理異常的狀況下才安排延續任務 Console.WriteLine("主線程退出"); Console.ReadKey();
缺點:異常沒有回到主線程。繼續改進code
var t = new Task(() => { throw new Exception("unknow excption"); }); t.Start(); var cat = t.ContinueWith(task => { throw task.Exception; }, TaskContinuationOptions.OnlyOnFaulted); //指定只應在延續任務前面的任務引起了未處理異常的狀況下才安排延續任務 Console.WriteLine("主線程退出"); Thread.Sleep(1000); //異常處理 try { cat.Wait(); } catch (AggregateException e) { foreach (var item in e.InnerExceptions) { Console.WriteLine("異常類型\t{0}\n來自\t{1}\n異常內容\t{2}", item.InnerException.GetType(), item.InnerException.Source, item.InnerException.Message); } }