捕獲不同線程中引發的異常:綜合指南
本文解決了從調用者捕獲單獨線程中引發的異常的常見問題方法。當方法 (Method1) 產生新線程,並且在該線程 (Method2) 中執行期間發生例外狀況時,就會出現問題。挑戰在於將此異常訊息傳回方法 1。
解決方案
在 .NET 4 及更高版本中,Task
1.在任務執行緒中單獨處理異常
在這種方法中,您可以在任務執行緒中處理異常,如以下程式碼片段所示:
class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.ContinueWith(ExceptionHandler, TaskContinuationOptions.OnlyOnFaulted); task.Start(); Console.ReadLine(); } static int Test() { throw new Exception(); } static void ExceptionHandler(Task<int> task) { var exception = task.Exception; Console.WriteLine(exception); } }
2.在呼叫者執行緒中處理異常
或者,您可以使用以下程式碼在呼叫者執行緒中處理例外狀況:
class Program { static void Main(string[] args) { Task<int> task = new Task<int>(Test); task.Start(); try { task.Wait(); } catch (AggregateException ex) { Console.WriteLine(ex); } Console.ReadLine(); } static int Test() { throw new Exception(); } }
請注意,取得的例外狀況是AggregateException類型,其中實際異常儲存在ex.InnerExceptions 中
.NET 3.5解決方案
在 .NET 3.5中,有兩種方法:
1.子線程中的異常處理
class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), Handler)); thread.Start(); Console.ReadLine(); } private static void Handler(Exception exception) { Console.WriteLine(exception); } private static void SafeExecute(Action test, Action<Exception> handler) { try { test.Invoke(); } catch (Exception ex) { Handler(ex); } } static void Test(int a, int b) { throw new Exception(); } }
2.調用者線程中的異常處理
class Program { static void Main(string[] args) { Exception exception = null; Thread thread = new Thread(() => SafeExecute(() => Test(0, 0), out exception)); thread.Start(); thread.Join(); Console.WriteLine(exception); Console.ReadLine(); } private static void SafeExecute(Action test, out Exception exception) { exception = null; try { test.Invoke(); } catch (Exception ex) { exception = ex; } } static void Test(int a, int b) { throw new Exception(); } }
以上是如何捕捉 .NET 中單獨執行緒引發的例外狀況?的詳細內容。更多資訊請關注PHP中文網其他相關文章!