关于函数的返回值,我有两个关于PowerShell最佳实践的问题。我有许多复杂的功能,至少需要返回成功或失败,加上一系列日志项,有时只是失败日志,有时还有成功和失败日志。有时函数也需要返回一个对象。我现在正在使用$ return Tuple作为哈希表。所以我可能在函数的末尾有这样的东西
@{
success = $success
log = $log
}
使用可能看起来像这样
$functionReturn = Function
if $functionReturn.success {
stuff
} else {
Write-Log $functionReturn.log
}
我很好奇是否有更好的模式在这里使用,或者这种方法是否非常可靠。如果是,是否有任何标准的命名约定等?作为一般规则,我尽量不重复使用"临时"变量,所以而不是$ functionReturn反复使用我会适当地命名变量,所以一个真实的函数调用可能是$readXML = Read-XML $xmlPath
。
任何有关最佳实践的建议都非常感谢。
另外,我已经看到了创建自定义对象以执行相同操作的参考,但从代码角度来看,哈希表似乎更清晰(更简单)。有没有理由使用自定义对象而不是哈希表?例如,哈希表在返回时是否具有大小限制,例如,大型日志数组加上大型XML对象?或者哈希表可以返回什么限制?或者它真的是六分之一,另外六分之一?
答案 0 :(得分:1)
如果需要通知调用者有关失败的信息,我会抛出异常。 IMO函数应该只返回一个布尔值,如果它实现了状态检查,即布尔值是实际数据。或者,如果语言不支持异常处理。
function Check-Something {
if ($someCondition) {
$true
} else {
$false
}
}
如果您需要处理错误条件,我将不会返回错误信息,就像返回有效数据一样。我会在函数内部执行状态记录以及记录非致命错误,并为致命错误抛出异常。
function Do-Something {
...
Write-Log 'regular log message'
...
if ($somethingUnimportantFailed) {
# log non-fatal error and continue
Write-ErrorLog 'unimportant failure'
}
...
if ($somethingWentTeriblyWrong) {
# abort what we're doing right now and notify caller
throw 'error information here'
}
...
Write-Log 'other regular log message'
...
}
try {
$returnedData = Do-Something
} catch {
Write-ErrorLog $_.Exception.Message
# more error handling here
}
一般情况下,如果可以在函数内部处理某些内容,我认为它应该在函数内部处理。如果必须由调用者处理失败,我只会将有关失败的信息传递给调用者。