【问题标题】:How can I catch an exception in script block? [duplicate]如何在脚本块中捕获异常? [复制]
【发布时间】:2016-07-15 05:46:33
【问题描述】:

我正在尝试使用库函数中的脚本块。我想确保我可以可靠地检测到提供的脚本块中的运行时错误并报告这些错误。在以下示例中,我创建了一个导致运行时错误的脚本块。

我的期望是 catch 块将捕获它并打印错误消息。这不会发生。它以红色文本将错误转储到控制台,但控制根本没有传递给 catch 块。

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt")

$results = ''

try {
    $results = & $cmd
}
catch {
    $results += "Error: $($_.Exception.Message)"
}

"Results: $results"

Results:

PS:>

有人可以帮我找出这个例子中的错误吗?

【问题讨论】:

  • try catch 只处理终止错误。 $cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt -ErrorAction Stop")
  • @MartinMaat 您引用的帖子包含我需要的信息。 continue 的默认错误操作是我的 try catch 被绕过的原因。如果我将其更改为停止,它将按我预期的方式工作。
  • @Matt 这正是我解决这个脚本问题所需的信息。请将此作为答案发布,以便我接受。
  • 如果我找不到一个好的副本(我确信有一个),我会在这里添加一个正确的答案。这里的区别是您显然使用的是脚本块,但问题不在于那个。

标签: powershell powershell-4.0


【解决方案1】:

我不完全确定你为什么要那样做。如果发生错误,您将希望显示错误,因此只需在 catch 中发生错误,然后如果结果不等于 null,则让它显示正确的结果。

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt")

$results = ''

try {
    $results = & $cmd
}
catch {
    write-error $_
}

if($results -ne $null){
    write-host "Results: $results"
}
<#else{
    #Error handling here, or have this action happen in the catch
}#>

【讨论】:

  • 我同意有几种方法可以处理消息。问题是这个错误根本没有调用 catch 块。这就是我坚持的部分。
  • 也许您需要将 try/catch 放在您的脚本块中?我相信只有当它是一个终止错误时才会起作用,所以你可能只需要做一些类似测试路径和后续 if 语句的事情来处理它。如果我知道确切的用例,我想给你指出正确的方向会更容易。
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 2013-12-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 2014-12-07
相关资源
最近更新 更多