PowerShell函数返回最佳实践

时间:2015-12-13 13:52:57

标签: function powershell return-value

关于函数的返回值,我有两个关于PowerShell最佳实践的问题。我有许多复杂的功能,至少需要返回成功或失败,加上一系列日志项,有时只是失败日志,有时还有成功和失败日志。有时函数也需要返回一个对象。我现在正在使用$ return Tuple作为哈希表。所以我可能在函数的末尾有这样的东西

@{
   success = $success
   log = $log
}

使用可能看起来像这样

$functionReturn = Function
if $functionReturn.success {
 stuff
} else {
 Write-Log $functionReturn.log
}

我很好奇是否有更好的模式在这里使用,或者这种方法是否非常可靠。如果是,是否有任何标准的命名约定等?作为一般规则,我尽量不重复使用"临时"变量,所以而不是$ functionReturn反复使用我会适当地命名变量,所以一个真实的函数调用可能是$readXML = Read-XML $xmlPath。 任何有关最佳实践的建议都非常感谢。

另外,我已经看到了创建自定义对象以执行相同操作的参考,但从代码角度来看,哈希表似乎更清晰(更简单)。有没有理由使用自定义对象而不是哈希表?例如,哈希表在返回时是否具有大小限制,例如,大型日志数组加上大型XML对象?或者哈希表可以返回什么限制?或者它真的是六分之一,另外六分之一?

1 个答案:

答案 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
}

一般情况下,如果可以在函数内部处理某些内容,我认为它应该在函数内部处理。如果必须由调用者处理失败,我只会将有关失败的信息传递给调用者。