スクリプト関数でエラーが発生したかどうかを検出する最適な方法は何ですか?私は、$に似たエラー/成功ステータスを示す一貫した方法を探していますか? (コマンドレットでのみ機能し、スクリプト関数では機能しません)。PowerShell:スクリプト関数のエラーを検出する
特定の関数が呼び出し元によって使用される値を返す場合、ブール値を返すことで成功を示すことはできません。関数は[ref]パラメータを使用して関数内で適切に値を設定し、呼び出し後にチェックすることができますが、これは私が望む以上にオーバーヘッドです。 PowerShellに組み込みのものがありますか?
私が思い付くことができる最高は次のとおりです。 に機能使用書き込みエラーで
- はエラー ストリームにErrorRecordオブジェクトを置きます。
- ErrorVariableパラメータを使用して関数を呼び出します。
- ErrorVariableパラメータ がコール後にnullでないかどうかを確認します。たとえば、
:
function MyFun {
[CmdletBinding()] # must be an advanced function or this
param() # will not work as ErrorVariable will not exist
process {
# code here....
if ($SomeErrorCondition) {
Write-Error -Message "Error occurred; details..."
return
}
# more code here....
}
}
# call the function
$Err = $null
MyFun -ErrorVariable Err
# this check would be similar to checking if $? -eq $false
if ($Err -ne $null) {
"An error was detected"
# handle error, log/email contents of $Err, etc.
}
はもっと良いものがありますか? $を使う方法はありますか?私たちのスクリプト関数では?私はむしろ例外やErrorRecordオブジェクトを投げたり、たくさんのtry/catchブロックを置いています。私はむしろ呼び出しの前にそこに他のエラーがある可能性があるので、関数呼び出しを行う前にカウントをチェックする必要があるので、$ Errorを使用しないでください。Clear()して失うことは望ましくありません。
なぜ 'try/catch'を使いたくないのですか?それは 'if'文をはるかに上回るものではありません。 'try {} catch {}'と 'if($ err){}'は2文字の違いだけです。 – Rynant
私がしたいのは: 'foo -ev Err' '($?-eq $ false){ReportError $ Err} ' try/catchのすべての関数呼び出しをラッピングすると、 'if(...){ReportError ...}'を使ったすべての関数呼び出しの後には、より洗練されたようです。私はtry/catchでコードをラップする方が好きです。本当にcatch/catchできない場合はエラーを防ぐことができます。 – DanW
'dir nodrivefound:\ 'を考えてください ErrorRecordsはエラーストリームに入れられ、2>または-ErrorVariable、$? $ falseであるため、エラーは簡単に検出されますが、スクリプトは終了せず、try/catchもありません。私はそのようなことを望んでいた。 – DanW