ja-JP/about_Trap.help.txt

TOPIC
    about_Trap

簡単な説明
    ステートメントを終了させるエラーおよびスクリプトを終了させるエラーを
    処理するキーワードを説明します。

詳細な説明
    終了エラーが発生すると、ステートメントの実行が停止します。PowerShell は
    現在のステートメントだけを停止する「ステートメント終了エラー」と、呼び出し
    スタック全体を巻き戻す「スクリプト終了エラー」を区別します。trap キーワード
    はどちらの種類も処理できます。エラーの分類について詳しくは、
    about_Error_Handling を参照してください。

    trap キーワードは、終了エラーが発生したときに実行するステートメントの一覧を
    指定します。trap ステートメントは、終了エラーを次のように処理できます。

    - trap ステートメントブロックを処理した後、trap を含むスクリプトまたは
      関数の実行を継続し、エラーを表示します。これが既定の動作です。

      注: if ステートメントや foreach ループなどの従属ステートメントブロック内で
      終了エラーが発生した場合、trap ブロック内のステートメントが実行され、
      従属ブロックの外側にある次のステートメントから実行が継続されます。

    - エラーを表示し、trap ステートメント内で break を使用して、trap を含む
      スクリプトまたは関数の実行を中止します。

    - trap ステートメント内で continue を使用して、エラーを表示せずに、trap を
      含むスクリプトまたは関数の実行を継続します。

    trap のステートメント一覧には、複数の条件や関数呼び出しを含められます。
    trap はログの書き込み、条件のテスト、別のプログラムの実行も行えます。

構文

    trap ステートメントの構文は次のとおりです。

    trap [[<error type>]] {<statement list>}

    trap ステートメントは、終了エラーが発生したときに実行するステートメントの
    一覧で構成されます。trap ステートメントは、trap キーワードと、省略可能な
    型式、そしてエラーが捕捉されたときに実行するステートメント一覧を含む
    ステートメントブロックから成ります。型式は、trap が捕捉するエラーの型を
    絞り込みます。

    スクリプトやコマンドは複数の trap ステートメントを持てます。trap
    ステートメントはスクリプトやコマンドのどこにでも記述できます。

すべての終了エラーを捕捉する

    スクリプトやコマンドで他の方法で処理されない終了エラーが発生すると、
    PowerShell はそのエラーを処理する trap ステートメントを探します。trap
    ステートメントがあれば、PowerShell はその trap ステートメントから
    スクリプトまたはコマンドの実行を継続します。

    次の例は最小の trap ステートメントです。

    trap { 'Error found.' }

    この trap ステートメントは、すべての終了エラーを捕捉します。

    次の例では、関数に実行時エラーを引き起こす無意味な文字列を含めています。

    function TrapTest {
        trap { 'Error found.' }
        nonsenseString
    }

    TrapTest

    この関数を実行すると、Error found. が表示され、続いて nonsenseString が
    認識されない旨のエラーが出力されます。

    次の例は、$_ または $PSItem 自動変数を使ってエラーを表示する trap
    ステートメントを含みます。

    function TrapTest {
        trap { "Error found: $_" }
        nonsenseString
    }

    TrapTest

    重要: trap ステートメントは特定のスクリプトブロック内のどこにでも定義でき
    ますが、常にそのスクリプトブロック内のすべてのステートメントに適用されます。
    実行時には、ブロック内の trap ステートメントは他のステートメントが実行される
    前に定義されます。これは JavaScript などでホイスティングと呼ばれる動作です。
    つまり、実行がその定義位置を通過していなくても、trap ステートメントは
    ブロック内のすべてのステートメントに適用されます。たとえばスクリプトの
    末尾に trap を定義し、最初のステートメントでエラーを発生させても、その
    trap は機能します。

特定のエラーを捕捉する

    スクリプトやコマンドは複数の trap ステートメントを持てます。trap は特定の
    エラーを処理するように定義できます。

    次の例は、特定のエラー CommandNotFoundException を捕捉する trap
    ステートメントです。

    trap [System.Management.Automation.CommandNotFoundException] {
        'Command error trapped'
    }

    PowerShell は .NET の例外型を使用します。次の例は System.Exception
    エラー型を指定します。

    trap [System.Exception] { 'An error trapped' }

    CommandNotFoundException エラー型は System.Exception 型を継承します。
    このステートメントは不明なコマンドによって発生するエラーを捕捉します。
    他のエラー型も捕捉します。

    エラーの例外型は、エラーオブジェクトを調べることで確認できます。次の例は、
    セッションで最後に発生したエラーの例外の完全名を取得する方法を示します。

    nonsenseString
    $Error[0].Exception.GetType().FullName

    スクリプト内には複数の trap ステートメントを持てます。各エラー型を捕捉
    できる trap ステートメントは 1 つだけです。終了エラーが発生すると、
    PowerShell は現在のスクリプトブロックから始めて、最も一致する trap を
    探します。

    次のスクリプト例にはエラーが含まれます。任意の終了エラーを捕捉する一般的な
    trap ステートメントと、CommandNotFoundException 型を指定する特定の trap
    ステートメントの両方を含みます。

    trap { 'Other terminating error trapped' }
    trap [System.Management.Automation.CommandNotFoundException] {
      'Command error trapped'
    }
    nonsenseString

    PowerShell は nonsenseString をコマンドレットなどとして認識しないため、
    CommandNotFoundException エラーを返します。特定の trap ステートメントが
    この終了エラーを捕捉します。

    次のスクリプト例は、同じ trap ステートメントで異なるエラーを発生させます。

    trap { 'Other terminating error trapped' }
    trap [System.Management.Automation.CommandNotFoundException] {
        'Command error trapped'
    }
    1/$null

    ゼロ除算は CommandNotFoundException エラーを作成しません。任意の終了
    エラーを捕捉するもう一方の trap ステートメントが、ゼロ除算エラーを
    捕捉します。

スクリプトブロック内のエラーを捕捉する

    既定では、終了エラーがスローされると、実行は trap ステートメントへ移ります。
    trap ブロックの実行後、制御はエラー発生位置の後にある次のステートメント
    ブロックへ戻ります。

    たとえば foreach ステートメント内で終了エラーが発生すると、trap
    ステートメントが実行され、foreach ブロック内ではなく foreach ブロックの
    後の次のステートメントから実行が継続されます。

    trap { 'An error occurred!'}
    foreach ($x in 3..-1) {
           "1/$x = "
           "`t$(1/$x)"
    }
    'after loop'

    出力を見ると、最後の反復までループが続きます。スクリプトが 1 を 0 で
    割ろうとすると、PowerShell は終了エラーをスローします。スクリプトは
    foreach ステートメントの残りをスキップし、trap ステートメントを実行し、
    foreach ステートメントの後から継続します。

エラーの捕捉とスコープ

    trap ステートメントと同じスクリプトブロックで終了エラーが発生した場合、
    PowerShell は trap で定義されたステートメント一覧を実行します。実行は
    エラーの後のステートメントから継続します。trap ステートメントがエラーとは
    異なるスクリプトブロックにある場合、実行は trap ステートメントと同じ
    スクリプトブロック内の次のステートメントから継続します。

    たとえば関数内でエラーが発生し、trap ステートメントが関数内にある場合、
    スクリプトは次のステートメントから継続します。次のスクリプトはエラーと
    trap ステートメントを含みます。

    function function1 {
        trap { 'An error: ' }
        NonsenseString
        'function1 was completed'
    }

    function1

    関数内の trap ステートメントがエラーを捕捉します。メッセージ表示後、
    PowerShell は関数の実行を再開します。function1 was completed が trap
    ステートメントの後に実行される点に注意してください。

    次の例と比較してください。同じエラーと trap ステートメントですが、ここでは
    trap ステートメントが関数の外側にあります。

    function function2 {
        NonsenseString
        'function2 was completed'
    }

    trap { 'An error:' }

    function2

    この例では function2 was completed コマンドは実行されません。どちらの例でも
    終了エラーは関数内で発生しますが、この例では trap ステートメントが関数の
    外側にあります。PowerShell は trap ステートメントの実行後に関数へ戻りません。

    注意: 同じエラー条件に対して複数の trap が定義されている場合、字句的に
    最初に定義された (スクリプトブロックで最も上にある) trap が使用されます。

    次の例では whoops 1 の trap だけが実行されます。

    Remove-Item -ErrorAction Stop ThisFileDoesNotExist
    trap { 'whoops 1'; continue }
    trap { 'whoops 2'; continue }

    重要: trap ステートメントはコンパイルされた場所にスコープされます。関数や
    ドットソースされたスクリプトの内部に trap ステートメントがある場合、その
    関数やドットソースされたスクリプトが終了すると、内部のすべての trap
    ステートメントは削除されます。

break と continue キーワードの使用

    trap ステートメント内で break と continue キーワードを使用すると、終了
    エラー後にスクリプトやコマンドの実行を継続するかどうかを指定できます。

    trap ステートメント一覧に break ステートメントを含めると、PowerShell は
    関数またはスクリプトを停止します。次のサンプル関数は trap ステートメント
    内で break キーワードを使用します。

    function break_example {
        trap {
            'Error trapped'
            break
        }
        1/$null
        'Function completed.'
    }

    break_example

    trap ステートメントに break キーワードが含まれているため、関数は実行を
    継続せず、Function completed 行は実行されません。

    trap ステートメントに continue キーワードを含めると、PowerShell は break や
    continue がない場合と同様に、エラーを引き起こしたステートメントの後から
    再開します。ただし continue キーワードがある場合、PowerShell はエラー
    ストリームにエラーを書き込みません。

    次のサンプル関数は trap ステートメント内で continue キーワードを使用します。

    function ContinueExample {
        trap {
            'Error trapped'
            continue
        }
        foreach ($x in 3..-1) {
           "1/$x = "
           "`t$(1/$x)"
        }
        'End of function'
    }

    ContinueExample

    エラーが捕捉された後、関数は再開し、End of function ステートメントが実行
    されます。エラーストリームにエラーは書き込まれません。

注意

    trap ステートメントは、スクリプトブロック内のすべての終了エラーが処理
    されることを保証する手段を提供します。きめ細かな制御を行うには、関連する
    try ステートメントだけにエラー処理が適用される try/catch ブロックを使用
    してください。詳しくは about_Try_Catch_Finally を参照してください。

関連項目
    about_Break
    about_Continue
    about_Error_Handling
    about_Scopes
    about_Throw
    about_Try_Catch_Finally

----
原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP