主題
    about_Trap

簡短描述
    說明處理終止錯誤的關鍵字。


完整描述
    終止錯誤會使陳述式停止執行。如果 Windows PowerShell 未以某種方式處理終止錯
    誤,則 Windows PowerShell 會同時停止執行目前管線中的函數或指令碼。在其他語
    言 (例如 C#) 中,終止錯誤稱為例外狀況。


    Trap 關鍵字會指定發生終止錯誤時要執行之陳述式的清單。Trap 陳述式會處理終止
    錯誤,並且允許繼續執行指令碼或函數,而不必停止。


  語法

      Trap 陳述式的語法如下:

          trap [[<錯誤類型>]] {<陳述式清單>}


      Trap 陳述式包含發生終止錯誤時要執行之陳述式的清單。Trap 關鍵字可以選擇性
      地指定錯誤類型。錯誤類型需使用方括號。


      一個指令碼或命令可以包含多個 Trap 陳述式。Trap 陳述式可以出現在指令碼或命
      令中的任何位置。


  捕捉所有終止錯誤

      發生終止錯誤時,若指令碼或命令中未採取任何處理動作,則 Windows PowerShell
      會檢查是否有處理錯誤的 Trap 陳述式。如果 Trap 陳述式存在,則 
      Windows PowerShell 會繼續在 Trap 陳述式中執行指令碼或命令。
 

      下列範例是非常簡單的 Trap 陳述式:

          trap {"找到錯誤。"}


      此 Trap 陳述式會捕捉任何終止錯誤。下列示範包含此 Trap 陳述式的函數:

          function TrapTest {
              trap {"找到錯誤。"}
              nonsenseString
              }


      此函數包含造成錯誤的無意義字串。執行此函數會傳回以下內容:

          C:\PS> TrapTest
          找到錯誤。


      下列範例包含使用 $_ 自動變數顯示錯誤的 Trap 陳述式:

          function TrapTest {
              trap {"找到錯誤: $_"}
              nonsenseString
              }


      執行此版本的函數會傳回以下內容:

          C:\PS> TrapTest
          找到錯誤: 無法辨識 'nonsenseString' 詞彙是否為 Cmdlet、函數、指令檔
          或可執行程式的名稱。請檢查名稱拼字是否正確,如果包含路徑的話,請確
          認路徑是否正確,然後再試一次。


      Trap 陳述式也可以更複雜。Trap 陳述式可以包含多個條件或函數呼叫。它可以記
      錄、測試或甚至執行另一個程式。


   捕捉指定的終止錯誤

      下列範例是捕捉 CommandNotFoundException 錯誤類型的 Trap 陳述式:

          trap [System.Management.Automation.CommandNotFoundException] 
          {"已捕捉命令錯誤"}


      當函數或指令碼遇到不符合已知命令的字串時,此 Trap 陳述式會顯示「已捕捉命
      令錯誤」字串。在執行 Trap 陳述式清單中的任何陳述式之後,Windows PowerShell
      會將錯誤物件寫入錯誤資料流,然後繼續執行指令碼。


      Windows PowerShell 使用 Microsoft .NET Framework 例外狀況類型。下列範例
      會指定 System.Exception 錯誤類型:

          trap [System.Exception] {"已捕捉錯誤"}


      CommandNotFoundException 錯誤類型繼承自 System.Exception 類型。此陳述式
      會捕捉未知命令所造成的錯誤,也會捕捉其他錯誤類型。


      指令碼可以包含一個以上的 Trap 陳述式。每個錯誤只會由一個 Trap 陳述式捕
      捉。如果發生錯誤,而且有多個可用的 Trap 陳述式,則 Windows PowerShell 會
      使用錯誤類型與所發生錯誤最相符的 Trap 陳述式。


      下列指令碼範例包含錯誤。此指令碼包含一個可捕捉任何終止錯誤的一般 Trap 陳
      述式,以及一個指定 CommandNotFoundException 類型的特定 Trap 陳述式。

          trap {"已捕捉其他終止錯誤" } trap 
          [System.Management.Automation.CommandNotFoundException] {"已捕捉命令
           錯誤"} nonsenseString


      執行此指令碼將產生以下結果:

          已捕捉命令錯誤
          無法辨識 'nonsenseString' 詞彙是否為 Cmdlet、函數、指令檔或可執行程式
          的名稱。請檢查名稱拼字是否正確,如果包含路徑的話,請確認路徑是否正
          確,然後再試一次。
          位於 C:\PS>testScript1.ps1:3 字元:19
          +   nonsenseString <<<< 


      由於 Windows PowerShell 無法將 "nonsenseString" 辨識為 Cmdlet 或其他項
      目,因此會傳回 CommandNotFoundException 錯誤。此終止錯誤是由特定 Trap 陳
      述式捕捉。


      下列指令碼範例包含具有不同錯誤的相同 Trap 陳述式:

          trap {"已捕捉其他終止錯誤" } trap 
          [System.Management.Automation.CommandNotFoundException] {"已捕捉命
           令錯誤"}
          1/$null


      執行此指令碼將產生以下結果:

          已捕捉其他終止錯誤
          嘗試以零除。
          位於 C:PS> errorX.ps1:3 字元:7
          +   1/ <<<< $null


      嘗試以零除並不會造成 CommandNotFoundException 錯誤。相反地,該錯誤是由捕
      捉任何終止錯誤的其他 Trap 陳述式捕捉。


  捕捉錯誤和範圍

      如果終止錯誤發生在與 Trap 陳述式相同的範圍中,則在執行 Trap 陳述式之後,
      Windows PowerShell 會在錯誤後從陳述式繼續執行。如果 Trap 陳述式位於與錯
      誤不同的範圍,則會從下一個與 Trap 陳述式位於相同範圍中的陳述式繼續執行。
 

      例如,如果錯誤發生在函數中,且 Trap 陳述式位於函數中,則指令碼會在下一個
      陳述式繼續執行。例如,下列指令碼包含錯誤和 Trap 陳述式:

          函數 function1 {
              trap { "錯誤: " }
              NonsenseString
              "function1 已完成"
              }


      稍後在指令碼中執行 Function1 函數時,會產生以下結果: 

          function1
          錯誤: 
          無法辨識 'NonsenseString' 詞彙是否為 Cmdlet、函數、指令檔或可執行程式
          的名稱。請檢查名稱拼字是否正確,如果包含路徑的話,請確認路徑是否正確
          ,然後再試一次。
          位於 C:\PS>TestScript1.ps1:3 字元:19
          +   NonsenseString <<<<

          function1 已完成 
 

      函數中的 Trap 陳述式會捕捉此錯誤。顯示訊息之後,Windows PowerShell 會繼
      續執行函數。請注意,Function1 已完成。


      比較此範例與下列包含相同錯誤和 Trap 陳述式的範例。在此範例中,Trap 陳述
      式是在函數外發生:

          函數 function2 {
              NonsenseString
              "function2 已完成"
              }

          trap { "錯誤: " }
              . . .
          function2


      稍後在指令碼中執行 Function2 函數時,會產生以下結果:

          錯誤: 
          無法辨識 'NonsenseString' 詞彙是否為 Cmdlet、函數、指令檔或可執行程式
          的名稱。請檢查名稱拼字是否正確,如果包含路徑的話,請確認路徑是否正
          確,然後再試一次。
          位於 C:\PS>TestScript2.ps1:4 字元:19
          +   NonsenseString <<<<


      在此範例中,"function2 已完成" 命令並未執行。雖然這兩個終止錯誤都是在函數
      內發生,但是如果 Trap 陳述式位於函數外,Windows PowerShell 就不會在 Trap 
      陳述式執行之後回到函數中。


  使用 Break 和 Continue 關鍵字

      您可以在 Trap 陳述式中使用 Break 和 Continue 關鍵字,決定指令碼或命令是否
      要在發生終止錯誤之後繼續執行。


      如果您在 Trap 陳述式清單中包含 Break 陳述式,則 Windows PowerShell 會停
      止函數或指令碼。下列範例函數在 Trap 陳述式中使用 Break 關鍵字:

          C:\PS> function break_example {
              trap {"已捕捉錯誤"; break;}
              1/$null
              "Function 已完成。"
              }

          C:\PS> break_example
          已捕捉錯誤
          嘗試以零除。
          位於第 4 行,第 7 個字元


      由於 Trap 陳述式已包含 Break 關鍵字,因此函數不會繼續執行,且「Function
      已完成」這行不會執行。


      如果您在 Trap 陳述式中包含 Continue 陳述式,則 Windows PowerShell 會在造
      成錯誤的陳述式之後繼續執行,就像未使用 Break 或 Continue 一般。不過,如果
      使用 Continue 關鍵字,Windows PowerShell 就不會將錯誤寫入錯誤資料流。


      下列範例函數在 Trap 陳述式中使用 Continue 關鍵字:

          C:\PS> function continue_example {
              trap {"已捕捉錯誤"; continue;} 
              1/$null
              "Function 已完成。"}

          C:\PS> continue_example
          已捕捉錯誤
          Function 已完成。


      函數會在捕捉錯誤且「Function 已完成」陳述式執行之後繼續執行,而且錯誤不
      會寫入錯誤資料流。


請參閱
    about_Break
    about_Continue
    about_Throw
    about_Try_Catch_Finally
    about_Scopes




目錄