主題
    about_Try_Catch_Finally

簡短描述
    說明如何使用 Try、Catch 和 Finally 區塊處理終止錯誤。


完整描述
    Try、Catch 和 Finally 區塊可用來回應或處理指令碼中的終止錯誤。此外,Trap 陳
    述式也可以用來處理指令碼中的終止錯誤。如需詳細資訊,請參閱 about_Trap。


    終止錯誤會使陳述式停止執行。如果 Windows PowerShell 未以某種方式處理終止錯
    誤,則 Windows PowerShell 會同時停止執行使用目前管線的函數或指令碼。在其他
    語言 (例如 C#) 中,終止錯誤稱為例外狀況。如需有關錯誤的詳細資訊,請參閱 
    about_Errors。


    Try 區塊可用來定義您希望 Windows PowerShell 在其中監視是否有錯誤的指令碼區
    段。當 Try 區塊內發生錯誤時,錯誤會先儲存在 $Error 自動變數中。接著,
    Windows PowerShell 會搜尋 Catch 區塊來處理錯誤。如果 Try 陳述式沒有相符的
    Catch 區塊,則 Windows PowerShell 會繼續在父範圍中搜尋適當的 Catch 區塊或 
    Trap 陳述式。當 Catch 區塊完成或未找到適當的 Catch 區塊或 Trap 陳述式時,
    就會執行 Finally 區塊。如果錯誤無法處理,則會寫入錯誤資料流。


    Catch 區塊可以包含用來追蹤失敗或復原所需指令碼流程的命令。Catch 區塊可以指
    定攔截的錯誤類型。Try 陳述式可以根據不同類型的錯誤包含多個 Catch 區塊。


    Finally 區塊可以用來釋放指令碼不再需要的任何資源。


    Try、Catch 和 Finally 類似 C# 程式語言中使用的 Try、Catch 和 Finally 關鍵
    字。


  語法
      Try 陳述式包含 Try 區塊、零個或多個 Catch 區塊,以及零個或一個 Finally 區
      塊。Try 陳述式必須至少有一個 Catch 區塊或一個 Finally 區塊。


      Try 區塊的語法如下:

          try {<陳述式清單>}


      Try 關鍵字後面接著以大括號括住的陳述式清單。如果終止錯誤是在陳述式清單中
      的陳述式正在執行時發生,則指令碼會從 Try 區段將錯誤物件傳遞至適當的
      Catch 區段。


      Catch 區塊的語法如下: 

          catch [[<錯誤類型>][',' <錯誤類型>]*] {<陳述式清單>}


      錯誤類型會出現在方括號中。最外面的方括號表示元素是選擇性的。


      Catch 關鍵字後面接著選擇性的錯誤類型規格清單和陳述式清單。如果終止錯誤發
      生於 Try 區塊中,則 Windows PowerShell 會搜尋適當的 Catch 區塊。如果找到
      Catch 區塊,則會執行該區塊中的陳述式。


      Catch 區塊可以指定一個或多個錯誤類型。錯誤類型是 Microsoft .NET Framework 
      例外狀況,或是衍生自 .NET Framework 例外狀況的例外狀況。Catch 區塊會處理
      指定的 .NET Framework 例外狀況類別的錯誤,或是衍生自指定類別之任何類別的
      錯誤。


      如果 Catch 區塊指定錯誤類型,則該 Catch 區塊會處理該錯誤類型。如果 Catch
      區塊未指定錯誤類型,則該 Catch 區塊會處理 Try 區塊中發生的任何錯誤。Try
      陳述式可以根據不同的指定錯誤類型包含多個 Catch 區塊。


      Finally 區塊的語法如下:

          finally {<陳述式清單>}


      Finally 關鍵字後面接著的陳述式清單會在每次指令碼執行時執行,即使 Try 陳
      述式已執行但未發生錯誤,或是在 Catch 陳述式中攔截到錯誤。


      請注意,按下 CTRL+C 會停止管線。傳送至管線的物件不會顯示為輸出。因此,如
      果您加入要顯示的陳述式,例如 "Finally block has run",則在您按下 CTRL+C
      之後,即使 Finally 區塊已執行,仍不會顯示該陳述式。


  攔截錯誤
      下列範例指令碼會示範 Try 區塊搭配 Catch 區塊:

          try { NonsenseString }
          catch { "發生錯誤。" }


      Catch 關鍵字必須緊接在 Try 區塊或另一個 Catch 區塊後面。


      Windows PowerShell 無法將 "NonsenseString" 辨識為 Cmdlet 或其他項目。因
      此,執行此指令碼會傳回以下結果:

          發生錯誤。


      當指令碼遇到 "NonsenseString" 時,就會造成終止錯誤。Catch 區塊會在區塊內
      執行陳述式清單以處理錯誤。


  使用多個 Catch 陳述式
      Try 陳述式可以擁有任意數目的 Catch 區塊。例如,下列指令碼包含會下載 
      MyFile.doc 的 Try 區塊,以及兩個 Catch 區塊:

          try
          {
             $wc = new-object System.Net.WebClient 
             $wc.DownloadFile("http://www.contoso.com/MyDoc.doc") 
	  }
          catch [System.Net.WebException],[System.IO.IOException] 
	  {
              "無法從 http://www.contoso.com 下載 MyDoc.doc。" 
	  }
          catch
          {
              "發生無法解決的錯誤。" 
	  }


      第一個 Catch 區塊會處理 System.Net.WebException 和 System.IO.IOException
      類型的錯誤。第二個 Catch 區塊未指定錯誤類型。第二個 Catch 區塊會處理發生
      的任何其他終止錯誤。


      Windows PowerShell 會依繼承比對錯誤類型。Catch 區塊會處理指定的 .NET 
      Framework 例外狀況類別的錯誤,或是衍生自指定類別之任何類別的錯誤。下列範
      例包含的 Catch 區塊會攔截「找不到命令」(Command Not Found) 錯誤:

          catch [System.Management.Automation.CommandNotFoundException] 
          {"繼承的例外狀況" }


      指定的錯誤類型 CommandNotFoundException 繼承自 System.SystemException 類
      型。
      下列範例也會攔截「找不到命令」(Command Not Found) 錯誤:      

          catch [System.SystemException] {"基底例外狀況" }


      此 Catch 區塊會處理「找不到命令」(Command Not Found) 錯誤和其他繼承自 
      SystemException 類型的錯誤。


      如果您指定錯誤類別和其中一個衍生類別,請將衍生類別的 Catch 區塊放在一般
      類別的 Catch 區塊前面。


  使用 Finally 釋放資源
      若要釋放指令碼使用的資源,請在 Try 和 Catch 區塊後面加入 Finally 區塊。無
      論 Try 區塊是否遇到終止錯誤,Finally 區塊陳述式都會執行。Windows 
      PowerShell 會在指令碼終止或目前區塊超出範圍之前執行 Finally 區塊。


      即使您使用 CTRL+C 停止指令碼,Finally 區塊仍會執行。如果 Exit 關鍵字從 
      Catch 區塊內停止指令碼,Finally 區塊還是會執行。


請參閱
    about_Errors
    about_Trap




目錄