当前位置: 首页 > 知识库问答 >
问题:

Powershell非终止错误并尝试捕获块

贡正诚
2023-03-14

我正在使用power shell控制台运行以下power外壳脚本:

$ob1 = "nonexistingclass"
$a = new-object $ob1 
Write-Output "Created new object"
Write-Output "End"

这将打印错误。然后继续并打印“创建的新对象”和“结束”。所以我假设这是一个非终结性错误。

但是,如果我将try catch块放在新对象周围,如下所示:

$ob1 = "nonexistingclass"
try
{
    $a = new-object $ob1 
    Write-Output "Created new object"
}
catch
{ 
    Write-Error "Exception Message: $($_.Exception.Message)"     
}
Write-Output "End"

在这种情况下,捕获块被击中并写入异常消息。

我的问题是:

    < li >这是一个非终止错误吗?这看起来像是一个非终止性错误,因为在错误之后继续执行(当没有try catch块时)。 < li >如果这不是终止错误,为什么当我添加try catch块时会遇到catch块?我的理解是catch块只会在终止错误时执行。 < li >即使我在第一个示例中使用-ErrorAction Stop调用new-object(没有try catch块),它仍然继续执行并打印最后两行。当我使用-ErrorAction stop时,我预计它应该抛出一个终止异常,脚本执行应该停止。是我理解错了吗?

共有2个答案

薛宇
2023-03-14

根据文档,有两种类型的 PowerShell 错误:终止和非终止。

还有另一种模糊的第三类错误。此类错误被<code>try</code>和<code>trap</code>捕获,即它们的行为类似于终止,但它们不会在没有<code>triy</code>或<code>trap</code>的情况下停止执行,即它们表现为非终止。

例如,如果命令名未被识别为cmdlet、函数、脚本文件或可操作程序的名称,则PowerShell会发出错误。此错误是否终止?这取决于。令人惊讶的是,默认情况下不会。

看起来经常使用错误操作首选项在脚本中停止或尝试捕获块是一个好主意。否则,半终止错误可能会导致问题,因为调用会继续。请注意,默认的错误操作首选项为“继续”。

半终止错误示例:

  1. 找不到命令。
  2. 除以零。
  3. 使用错误的参数调用 .NET 方法。
  4. 电源外壳无法将数据转换为某种类型。
  5. 找不到 .NET 类型。(注意你的案子)
  6. 在严格模式下找不到属性。
  7. 在严格模式下找不到变量。
  8. 找不到命令参数。
  9. 赋值到不可写变量。
  10. 不支持的提供程序功能。
  11. .NET 异常。

该列表可能会继续...

假设

这些测试给出了这样一个概念:任何运行时异常都是半终止错误。

查看测试脚本的完整案例 - 强力外壳陷阱/异常类型的错误

更新(如评论中所述):

关于此类错误详细信息的官方文档并不多。但以下是 PowerShell 文档html" target="_blank">存储库中的全面讨论:

https://github.com/MicrosoftDocs/PowerShell-Docs/issues/1583

楚方伟
2023-03-14

终止错误并不总是意味着脚本将停止执行,它通常只是意味着它们会引发 PipelineStoppedException,这意味着处理将在该管道上停止,但将继续执行脚本的其余部分。因此,要回答您的问题,是的,这是一个终止错误,但它并没有停止整个脚本的执行,这就是为什么它击中了捕获块。

-ErrorAction stop开关只是有效地让cmdlet抛出一个终止错误,以便您可以捕获该错误,它不会停止脚本(因此,您的最后一行仍然会被执行)。如果希望脚本停止,可以在catch块中放置< code>Exit命令,以便在该点结束脚本。

见:

终止错误

非终止错误

 类似资料:
  • 我想捕捉和处理非终止错误,但使用-ErrorAction SilentlyContinue。我知道我需要使用-ErrorAction-Stop来捕获非终止错误。该方法的问题是,我不希望try脚本块中的代码实际停止。我希望它继续,但处理非终止错误。我也希望它保持沉默。这可能吗?也许我走错了方向。 我想处理的非终止性错误的一个例子是从Get-Childitem访问关键字文件夹的拒绝访问错误。这是一个例

  • 本文向大家介绍什么是PowerShell中的终止和非终止错误?,包括了什么是PowerShell中的终止和非终止错误?的使用技巧和注意事项,需要的朋友参考一下 Powershell执行脚本或命令时会生成两种类型的错误。终止错误和非终止错误。 终止错误-该错误是由您创建的脚本,函数或命令生成的,并且会停止或停止脚本的执行,从而导致下一行中的命令无法执行。要处理此错误,需要适当的机制,否则将显示错误消

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 在 中,尝试捕获最终阻止的工作原理是什么? 所以如果有例外,我知道它会跳到捕获块,然后跳到最后的块。 但是如果没有错误,catch块不会运行,但是finally块会运行吗?

  • 本文向大家介绍浅谈PowerShell 捕获错误,包括了浅谈PowerShell 捕获错误的使用技巧和注意事项,需要的朋友参考一下 之前的文章我们演示了如何使用 Windows PowerShell 构建相当高级的清单工具。我创建的工具提供了多个有关输出的选项,这应归功于外壳的内置功能和将函数应用于对象。 我所创建的函数有一个无可否认的弱点:它不能适度处理可能发生的任何错误(例如连接或权限问题)。