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