この素晴らしい記事で、Keith は Powershell の終了エラーと非終了エラーの違いについて説明しています。Keith によると、.NET オブジェクトまたは型のメンバーへの呼び出しからスローされる例外は非終了エラーです。
実際、テスト用にこの .NET クラスを定義すると、次のようになります。
$a = Add-Type 'public class bla { public static void bl() { throw new System.ApplicationException("test"); }}' -PassThru
そして、この関数:
function tst { 1 | write-host; $a::bl(); 2 | Write-host }
tst 関数が呼び出されると、例外が終了しないように見えることがわかります。2 番目の関数は機能しますWrite-Host
。
しかし、これを考慮してください:
function tst2 { try { tst } catch { "Catch!" } }
ドキュメントを開くと、キャッチがスクリプトの終了エラーに応答または処理することがわかります。記事のテキスト全体を通して、記事が扱っているエラーは、多くの場所で「終了」と見なされます。
したがって、上の行を実行すると、2 番目の Write-Host は実行されませんが、catch ブロックは実行されます。未終了エラーが突然終了するようです。
どうして?
もう 1 つの観察結果は、古き良きトラップではまだ終了しないエラーであるということです。
function tst3 { tst trap { "Trap!" } }
さて、実用的な観点から、私が達成したいことは次のとおりです。コードのブロックで、.NET コードからスローされた例外で終了したいと考えています。コマンドレットの終了エラーからの終了エラーと、コマンドレットの非終了エラーからの非終了エラーを残したいです。
どうすればこれを達成できますか?
例:
Do-Something
Call::Something()
Do-SomethingElse
Call::SomethingElse()
Do-YetMoreSomething
Call::YetMoreSomething()
上記の .NET 呼び出しからのすべての例外で終了したいと考えています。また、コマンドレットからの終了エラーで終了したいと考えています。コマンドレットからの非終了エラーで終了したくありません。