1. 程式人生 > 其它 >C#執行緒 入門-異常處理

C#執行緒 入門-異常處理

技術標籤:C#教程c#

異常處理
建立執行緒時,作用域中的任何try / catch / finally塊都與執行緒開始執行時無關。考慮以下程式:

public static void Main()
{
  try
  {
    new Thread (Go).Start();
  }
  catch (Exception ex)
  {
    // We'll never get here!
    Console.WriteLine ("Exception!");
  }
}
  

static void Go() { throw null; } // Throws a NullReferenceException

此示例中的try / catch語句無效,並且新建立的執行緒將受到未處理的NullReferenceException的阻礙。當您認為每個執行緒都有一個獨立的執行路徑時,此行為很有意義。

補救措施是將異常處理程式移至Go方法中:

public static void Main()
{
   new Thread (Go).Start();
}
  
static void Go()
{
  try
  {
    // ...
    throw null;    // The NullReferenceException will get caught below
    // ...
  }
  catch
(Exception ex) { // Typically log the exception, and/or signal another thread // that we've come unstuck // ... } }   

在生產應用程式中的所有執行緒進入方法上都需要一個異常處理程式,就像在主執行緒上一樣(通常在執行堆疊中處於更高級別)。未處理的異常會導致整個應用程式關閉。與一個醜陋的對話!

在編寫此類異常處理塊時,很少會忽略該錯誤:通常,您會記錄異常的詳細資訊,然後顯示一個對話方塊,允許使用者自動將這些詳細資訊提交到您的Web伺服器。然後,您可能會關閉該應用程式-因為該錯誤有可能破壞了程式的狀態。但是,這樣做的代價是使用者將丟失其最近的工作-例如開啟的文件。

WPF和Windows Forms應用程式vb.net教程的“全域性”異常處理事件(Application.DispatcherUnhandledException和Application.ThreadException)僅針對在主UI執行緒上引發的異常觸發。您仍然必須手動處理工作執行緒上的c#教程異常。

AppDomain.CurrentDomain.UnhandledException在任何未處理的異常上觸發,但沒有提供防止應用程式隨後關閉的方法。但是,在某些情況下,您不需要處理工作執行緒上的異常,因為.NET Framework會為您處理異常。這些將在接下來的部分中介紹,分別是:

非同步委託
後臺工作者
任務並行庫(適用條件)