2016-03-28 15 views
0

私はライブラリ関数でスクリプトブロックを扱おうとしています。私は、提供されたスクリプトブロックで実行時エラーを確実に検出し、これらを報告できることを確認したい。次の例では、実行時エラーが発生するスクリプトブロックを作成します。スクリプトブロックで例外をキャッチするにはどうすればよいですか?

私の期待は、キャッチブロックがキャプチャしてエラーメッセージを出力することです。これは起こりません。赤いテキストでコンソールにエラーをダンプしますが、コントロールはcatchブロックにまったく渡されません。

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt") 

$results = '' 

try { 
    $results = & $cmd 
} 
catch { 
    $results += "Error: $($_.Exception.Message)" 
} 

"Results: $results" 

Results: 

PS:> 

この例で間違いを見つけてもらえますか?

+0

try catchは__terminating errors__を処理します.__ '$ cmd = [ScriptBlock] :: Create(" Get-Content doesnotexist.txt -ErrorAction Stop ")' – Matt

+1

これを見てくださいhttp://stackoverflow.com/questions/9948517/how-to-stop-a-powershell-script最初のエラーとこれはhttp://stackoverflow.com/questions/13820140/how-can-i-rethrow-an-exception-from-catch-block-in-powershell –

+0

@MartinMaatあなたが参照した投稿必要な情報が含まれていました。 continueのデフォルトのエラーアクションは、私のtry catchがバイパスされた理由です。私がそれをストップに変えれば、それは私が期待している通りに働く。 –

答えて

0

なぜあなたはそれをどうやってやっているのか完全にはわかりません。エラーが表示された場合は、エラーが表示された場合は、catchに入力してから、結果がnullと等しくなければ、適切な結果を表示させてください。

$cmd = [ScriptBlock]::Create("Get-Content doesnotexist.txt") 

$results = '' 

try { 
    $results = & $cmd 
} 
catch { 
    write-error $_ 
} 

if($results -ne $null){ 
    write-host "Results: $results" 
} 
<#else{ 
    #Error handling here, or have this action happen in the catch 
}#> 
+0

私は、メッセージを処理するいくつかの方法があることに同意します。問題は、このエラーがキャッチブロックをまったく呼び出さないことです。それは私が立ち往生している部分です。 –

+0

おそらく、try/catchをスクリプトブロック内に置く必要がありますか?私はそれが終了エラーである場合にのみ動作すると信じているので、テストパスとそれに続くif文のような処理をするだけでよいでしょう。正確なユースケースを知っていれば、正しい方向に向けるほうが簡単だと思います。 – nkasco

関連する問題