在此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来定义?不是代码的实际终止行为,而是脚本如何处理它......? –