主題 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