非终止错误处理 - if $ Error.count和$ ErrorActionPreference ='stop'之间的区别

时间:2017-09-04 18:04:16

标签: powershell error-handling scripting powershell-v3.0

我需要在powershell脚本中处理非终止错误。最有效的方法是什么?

$ErrorActionPreference变量设置为停止并使用try / catch

$ErrorActionPreference = 'stop'
try{
    functionThatCanFail
}catch{
    #Do Stuff
}

或者清除$Error变量,然后评估它是否已填充

$Error.Clear()
functionThatCanFail
if( $Error.Count -ne 0){
    #Do Stuff
}

2 个答案:

答案 0 :(得分:2)

我会在您的函数中添加private void ButtonClicked(Object sender, ...) { var yourTextBox = ((Panel)((Button)sender).Parent).Children.OfType<TextBox>().First(); var yourText = yourTextBox.Text; } 并将其放入try / catch中 由于CmdletBinding,您现在可以使用参数[CmdletBinding()]调用您的函数 -ErrorAction Stop$ErrorAction的其他建议也可行,但不是“干净”。方式。


$Error.Clear()

答案 1 :(得分:0)

最简单的方法是使用 -ErrorVariable / -ev公共参数,它会记录给定cmdlet在指定变量中报告的所有非终止错误。

但请注意,此仅适用于 cmdlet 高级功能 / scripts,因为只有它们支持common parameters - 有关如何将自己的函数定义为高级函数,请参阅Patrick's helpful answer

# Provoke a non-terminating error and silence it, 
# but store it in custom variable $err via common parameter -ErrorVariable
Get-Item /NoSuchFile -ErrorAction SilentlyContinue -ErrorVariable err

if ($err) { # if a / a least one non-terminating error was reported, handle it.
  "The following non-terminating error(s) occurred:`n$err"
}

这样,错误分析就是命令范围的,而不必记录会话级$Error集合的状态或改变其状态。

但请注意,您无法以这种方式处理终止错误。 有关PowerShell错误处理的全面概述,请参阅here