2017-11-25 6 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は終了エラーがヒットした場合、それがスローされます呼び出し元に。スクリプトのmy関数呼び出しの周りのTry/Catchはこのエラーを受け取り、独自の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 
    } 
} 

私は私自身の機能/コマンドレットを設計していた場合、私はカスタム​​オブジェクトがスローされるように生成します:たとえば、このメソッドを使用して

#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

関連する問題