在此great article Keith解釋Powershell中終止錯誤和非終止錯誤之間的區別。根據Keith從調用.NET對象或類型成員中拋出的異常是非終止錯誤。是.net方法的異常終止或不終止錯誤?
事實上,如果我們定義這個.NET類來進行測試:
$a = Add-Type 'public class bla { public static void bl() { throw new System.ApplicationException("test"); }}' -PassThru
然後將此功能:
function tst { 1 | write-host; $a::bl(); 2 | Write-host }
我們會看到,當TST功能被稱爲例外似乎是不終止:第二個Write-Host
的作品。
但想一想:
function tst2 { try { tst } catch { "Catch!" } }
如果我們打開the documentation,我們可以讀到,抓響應或腳本處理終止錯誤。在整篇文章中,文章處理的錯誤在許多地方被認定爲「終止」。
所以當我們運行上面的第二個寫主機不運行,但catch塊的確如此。看來,我們的非終止錯誤突然終止。
怎麼回事?
另一種看法是,具有良好的老陷阱,它仍然非終止錯誤:
function tst3 { tst trap { "Trap!" } }
現在,從實用的角度來看,我想達到如下。在一段代碼中,我想終止.NET代碼拋出的異常。我希望從cmdlet中終止錯誤並終止cmdlet的非終止錯誤,並且不終止。
我該如何做到這一點?
例子:
Do-Something
Call::Something()
Do-SomethingElse
Call::SomethingElse()
Do-YetMoreSomething
Call::YetMoreSomething()
我想對所有的異常終止,從.NET上述呼籲。我也想終止從cmdlet中終止錯誤。我不想終止來自cmdlet的非終止錯誤。
@keithhill你能幫忙嗎?謝謝! –
是不是可以通過$ ErrorActionPreference來定義?不是代碼的實際終止行爲,而是腳本如何處理它......? –