static void Main(string[] args) { try { Task.Run(() => { throw new Exception("occurs in task"); }); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); }執行上述程式你會發現 cmd 沒寫 ex.Message,原因是 exception handling 是 per thread 的,也就是說在外緒發生的 exception 主緒 catch 不到。
這有幾個解
1. 把 try catch 改包在裡面(這個最簡單)
static void Main(string[] args) { Task.Run(() => { try { throw new Exception("occurs in task"); } catch (Exception ex) { Console.WriteLine(ex.Message); } }); Console.ReadLine(); }
2. 靠 TaskStatus 判斷執行結果並挖掘其中的錯誤
var t = Task.Run(() => { throw new Exception("occurs in task"); }) .ContinueWith((result) => { if (result.Status == TaskStatus.Faulted) { foreach (var ex in result.Exception.InnerExceptions) { Console.WriteLine(ex.Message); } } });
3. 使用 await
static void Main(string[] args) { FooAsync(); Console.ReadLine(); } private static async Task FooAsync() { try { await Task.Run(() => { throw new Exception("occurs in task"); }); } catch (Exception ex) { Console.WriteLine(ex.Message); } }
沒有留言:
張貼留言