【发布时间】:2017-11-14 05:44:48
【问题描述】:
检测脚本函数中是否发生错误的最佳方法是什么?我正在寻找一种一致的方式来指示类似于 $? 的错误/成功状态(仅适用于 cmdlet,不适用于脚本函数)。
给定一个特定的函数可能会返回一个供调用者使用的值,我们不能通过返回一个布尔值来表示成功。函数可以使用 [ref] 参数并在函数内部适当地设置值并在调用后检查,但这比我想要的开销更大。我们可以使用 PowerShell 内置的东西吗?
我能想到的最好的是:
- 在函数中使用 Write-Error 来 将 ErrorRecord 对象放入错误中 流;
- 调用函数 错误变量参数;
- 检查ErrorVariable参数是否 调用后不为空。
例如:
function MyFun {
[CmdletBinding()] # must be an advanced function or this
param () # will not work as ErrorVariable will not exist
process {
# code here....
if ($SomeErrorCondition) {
Write-Error -Message "Error occurred; details..."
return
}
# more code here....
}
}
# call the function
$Err = $null
MyFun -ErrorVariable Err
# this check would be similar to checking if $? -eq $false
if ($Err -ne $null) {
"An error was detected"
# handle error, log/email contents of $Err, etc.
}
还有更好的吗?有没有使用$的方法?在我们的脚本函数中?我宁愿不抛出异常或 ErrorRecord 对象,并且到处都有大量的 try/catch 块。我也不想使用 $Error ,因为这需要在调用函数之前检查计数,因为在调用之前可能存在其他错误 - 我不想 Clear() 并丢失它们。
【问题讨论】:
-
你为什么不想使用
try/catch?它并没有比if语句增加多少;try{}catch{}与if($err){}仅相差 2 个字符。 -
我想做的是:
foo -ev Errif ($? -eq $false) { ReportError $Err }在 try/catch 中包装每个函数调用让我分心;使用if (...) { ReportError ... }跟踪每个函数调用似乎更干净。如果我真的无法捕获/防止终止错误,我宁愿只在 try/catch 中包装代码。 -
想想
dir nodrivefound:\ErrorRecords被放到错误流中,可以用2>或者-ErrorVariable, $?是 $false,因此很容易检测到错误,但脚本不会终止,也没有 try/catch。我希望有这样的东西。