powershell - .NET 方法的异常是终止错误还是非终止错误?

标签 powershell exception error-handling

在此great article Keith 解释了 Powershell 中终止错误和非终止错误之间的区别。根据 Keith 的说法,调用 .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 响应或处理脚本中的终止错误。在整个文章的文本中,文章所处理的错误在许多地方被限定为“终止”。

因此,当我们运行上面的行时,第二个 Write-Host 不会运行,但 catch block 会运行。看起来我们的非终止错误突然变成了终止错误。

怎么会这样?

另一个观察结果是,对于好的旧陷阱来说,它仍然是非终止错误:

function tst3 { tst trap { "Trap!" } }

现在,从实际角度来看,我想要实现的目标如下。在代码块中,我想在 .NET 代码抛出异常时终止。我想保留来自 cmdlet 终止的终止错误和来自非终止 cmdlet 的非终止错误。

如何实现这一目标?

示例:

Do-Something
Call::Something()
Do-SomethingElse
Call::SomethingElse()
Do-YetMoreSomething
Call::YetMoreSomething()

我想终止上述 .NET 调用的所有异常。我还想在 cmdlet 出现终止错误时终止。我不想因 cmdlet 出现非终止错误而终止。

最佳答案

是的,这在今年早些时候出现在 PowerShell MVP 电子邮件列表中。 PowerShell 根据是否存在外部 try/catch 来更改其对 .NET 异常的错误处理行为。这只是猜测,但我猜测这是针对简单的脚本场景。也就是说,如果脚本编写者(管理员)在调用 .NET 方法时出错并生成异常,PowerShell 团队不希望整个脚本的执行停止。一旦 V2 出现并引入了正确的 try/catch,我猜他们必须重新考虑该决定并提出当前的妥协方案。

也就是说,正如您所发现的,解决这个问题很痛苦。您可以在脚本级别将 $ErrorActionPreference 设置为 Stop,然后对于每个可以生成非终止错误的 cmdlet,使用 -ErrorAction Continue 参数。或者,您可以将所有 .NET 调用放入高级函数中,然后使用参数 -ErrorAction Stop 调用该函数。我希望有一个更好的答案,但在查看 MVP 线程后,我没有看到任何更好的解决方案。

关于powershell - .NET 方法的异常是终止错误还是非终止错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17847276/

相关文章:

csv - CSV 中的查找值和第二列的返回值

android - 加载 YouTube 视频时出现 ActivityNotFoundException

c++ - 编写多线程异常安全代码

javascript - 具有多个值的Textarea的JavaScript表单验证

php - 我怎样才能告诉 PHP 将异常转储为原始文本而不是 HTML?

windows - 发布时出现异常,异常信息[Exec timed out or was interrupted after .. ms]

windows - 将数字转换为星期几列表

c# - 如何创建一个Windows App(C#),在其中可以在消息框中显示各种对象中的所有异常

powershell - Windows7 中的 Add-PsSnapin WebAdministration

java - 自定义 Grails 异常处理