以下是我的測驗腳本:
trap {"trapped"}。
if ($true) {
nonsenseString1
exit 0
}
nonsenseString2
而結果是:
trapped
nonsenseString1 : 術語'nonsenseString1' 是 不被識別 ...
陷阱
nonsenseString2 : 術語'nonsenseString2' 是 不認可 ...
如果這不是我想要的,也不是我所期望的。在它捕獲了nonsenseString1之后,它應該exit 0,為什么它沒有?這種情況在Powershell 5和7中都有發生。
我發現這與if條件塊有關。如果我去掉這個塊,那么它就會像我預期的那樣。
PS:我的真正目的是記錄Powershell腳本上可能發生的任何錯誤,人們告訴我應該使用Start-Transcript:
如何在Powershell腳本中重定向stdout和stderr?
因為我不知道錯誤何時發生,所以我想在一個陷阱中Stop-Transcript。
uj5u.com熱心網友回復:
選擇性地使用try / catch / finally 陳述句對個別陳述句引起的終止錯誤采取行動(也見底部章節):
$trapActions = { "trapped" }
trap { & $trapActions }
if ($true) {
try {
nonsenseString1
} catch {
$_ | Write-Error ?
& $trapActions Error ?
exit 1
}
}
nonsenseString2
注意,我使用了 注意, 如果在第一個終止性錯誤時退出是可以接受的--無論它發生在哪里--你可以簡單地在你的原始代碼中使用exit 1,因為按照慣例,失敗的信號是nonzero退出代碼。
trap只對終止錯誤(包括陳述句和腳本終止的錯誤)采取行動,而不是對更典型的非終止錯誤采取行動。
trap { "trapped"; break }。
至于你所嘗試的:
問題確實在于,當trap陳述句被觸發時,enclosing block({ . ...})被退出,因此exit 0永遠不會被執行;相反,執行將從塊后的第一個陳述句開始,因此nonsenseString2也被執行。
這反映了try { ... } catch { ... } finally { ... }陳述句,它比trap更晚被引入,如今通常用來代替后者。
也就是說,一旦在try塊內發生終止錯誤,控制權就會轉移到catch塊,而try塊內的任何剩余陳述句都不會被執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309296.html
標籤:
