2017-11-25 82 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