2017-11-25 85 views
5

这是我想的最佳实践问题。使用函数进行PowerShell错误处理

在设计将在脚本中使用的函数时,处理函数中可能发生的错误的最佳方法是什么?

例如,假设我们有做X和Y基本功能:

Function Test-Function 
{ 
    Try 
    { 
     <# Something in here that would generate an error #> 
    } 
    Catch 
    { 
     Throw 
    } 

    Return $someReturnResultIWantInMyScript 
} 

我的脚本调用此函数:

Try 
{ 
    $ValueIWantFromFunction = Test-Function 
} 
Catch 
{ 
    <# Do something here #> 
} 

如果Test-Function命中终止错误,它会抛出给来电者。围绕脚本中的函数调用的Try/Catch将收到此错误并触发它自己的捕获。然后我可以决定做什么。

如果我没有在函数中抛出错误,脚本不会看到终止错误,然后我的$ValueIWantFromFunction可能包含$Null或其他没有用的东西。

这是一个错误处理与脚本内的函数和函数调用的好方法吗?有没有更好的办法?

+0

我会说这取决于使用情况。大多数情况下,这些选项可以让您选择。如果可以用其他条件逻辑避免,最好的做法是避免触发这些错误。 – Matt

+0

不管你的try/catch如何,终止错误都会发送给调用者,除非你的try/catch阻止了它。 – TheIncorrigible1

+0

那么如果函数也返回一个值(假设它成功了),我该如何处理错误呢? – PnP

回答

0

作为一个最佳实践,我喜欢使用异常来处理函数/脚本中的错误并将它们记录下来,以便调用者知道哪里出了问题。例如:

Function Remove-File 
{ 
    [CmdletBinding()] 
    [OutputType([Int])] 
    Param(
     [Parameter(Mandatory)] 
     [String]$Path 
    ) 

    Try 
    { 
     Remove-Item -Path $Path 
     Return 0 
    } 
    Catch 
    { 
     Return 1 
    } 
} 

如果我设计我自己的函数/ cmdlet时,我会生成自定义​​对象抛出:

#Requires -Version 5 
If ($ErrorCondition) 
{ 
    $PSCmdlet.ThrowTerminatingError(
     [System.Management.Automation.ErrorRecord]::new(
      [System.Exception]::new('Error message'), 
      'FullyQualifiedName', 
      [System.Management.Automation.ErrorCategory]::DeviceError, 
      $ErrorCausingObject 
     ) 
    ) 
} 

使用这种方法,我可以包括在文档中根据错误发生哪些错误会被抛出,因此调用者可以根据抛出的错误利用多个捕获并处理它。

这里有一些不错的文章:
Everything about exceptions
Scripting Guy: Handling errors
On the OutputType attribute