PowerShell HelpFile - about_trap
 記事記号:[me1588] 初版:2011/May/10

この文書は、Windows PowerShellのヘルプ機能で表示される内容を再構成したものです。

トピック
    about_Trap

簡易説明
    終了エラーを処理するキーワードについて説明します。


詳細説明
    終了エラーが発生すると、ステートメントの実行が中止されます。終了エラーに対し
    て何も処理を行わなかった場合、Windows PowerShell は、現在のパイプラインの関
    数やスクリプトの実行も中止します。C# など、他の言語では、終了エラーのことを 
    "例外" と呼んでいます。


    Trap キーワードは、終了エラーが発生したときに実行する一連のステートメントを
    指定するものです。Trap ステートメントで終了エラーを処理することによって、ス
    クリプトまたは関数の実行を中止せずに、続行させることができます。


  構文

      Trap ステートメントの構文を次に示します。

          trap [[]] {}


      Trap ステートメントには、終了エラーが発生したときに実行する一連のステート
      メントを指定します。Trap キーワードには、必要に応じてエラーの型を指定する
      こともできます。エラーの型は角かっこで囲んで指定する必要があります。


      スクリプトまたはコマンドは、複数の Trap ステートメントを持つことができます。
      スクリプト内またはコマンド内の任意の場所に Trap ステートメントを記述するこ
      とができます。


  すべての終了エラーのトラップ

      どうしても処理することのできない終了エラーがスクリプトまたはコマンドで発生
      した場合、Windows PowerShell は、そのエラーを処理できる Trap ステートメン
      トがないか調べます。Trap ステートメントが存在した場合は、引き続き、Trap ス
      テートメントのスクリプトまたはコマンドを実行します。
 

      非常に単純な Trap ステートメントの例を次に示します。

          trap {"Error found."}


      この Trap ステートメントは、すべての終了エラーをトラップします。次の例は、
      この Trap ステートメントを含む関数です。

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


      この関数には、エラーの原因となる、意味のない文字列が存在します。この関数を
      実行すると、次のような結果になります。

          C:\PS> TrapTest
          Error found.


      次の例には、$_ 自動変数を使用してエラーを表示する Trap ステートメントが含
      まれています。

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


      このバージョンの関数を実行すると、次のような結果になります。

          C:\PS> TrapTest
          Error found: 文字列 'nonsenseString' は、コマンドレット、関数、スクリ
          プト ファイル、または操作可能なプログラムの名前として認識されません。
          名前が正しく記述されていることを確認し、パスが含まれている場合はそのパ
          スが正しいことを確認してから、再試行してください。


      Trap ステートメントで、より複雑な処理を行うこともできます。Trap ステートメ
      ントには、複数の条件や関数呼び出しを含めることができます。ログの記録や条件
      判定を行ったり、別のプログラムを実行することもできます。


   特定の終了エラーのトラップ

      次の例は、CommandNotFoundException エラー型をトラップする Trap ステートメ
      ントです。

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


      関数またはスクリプトで、既知のいずれのコマンドとも一致しない文字列が検出さ
      れた場合、この Trap ステートメントによって "Command error trapped" という
      文字列が表示されます。Windows PowerShell は、一連の Trap ステートメントを
      実行した後、エラー ストリームにエラー オブジェクトを書き込んだうえで、スク
      リプトを続行します。


      Windows PowerShell では、Microsoft .NET Framework の例外型が使用されています。
      System.Exception エラー型を指定する例を次に示します。

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


      CommandNotFoundException エラー型は、System.Exception 型を継承しています。
      このステートメントは、不明なコマンドであることが原因で発生したエラーをトラ
      ップします。さらに、それ以外のエラー型もトラップします。


      スクリプトには、複数の Trap ステートメントを記述できます。1 つのエラーを複
      数の Trap ステートメントでトラップすることはできません。複数の Trap ステー
      トメントが存在する場合は、発生したエラーを最も具体的に表すエラー型の Trap 
      ステートメントが Windows PowerShell によって選択され、使用されます。


      次のスクリプトの例には、エラーが存在しています。すべての終了エラーをトラッ
      プする汎用的な Trap ステートメントに加えて、CommandNotFoundException 型を
      具体的に指定する Trap ステートメントも記述されています。

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


      このスクリプトを実行すると、次のような結果になります。

          Command error trapped
          文字列 'nonsenseString' は、コマンドレット、関数、スクリプト ファイル、
          または操作可能なプログラムの名前として認識されません。名前が正しく記述
          されていることを確認し、パスが含まれている場合はそのパスが正しいことを
          確認してから、再試行してください。発生場所
          C:\PS>testScript1.ps1:3 文字:19
          +   nonsenseString <<<<


      "nonsenseString" は Windows PowerShell が認識できる項目 (コマンドレットな
      ど) ではないので、CommandNotFoundException エラーが返されます。この終了エ
      ラーは、エラーの型を具体的に定義した Trap ステートメントによってトラップさ
      れることになります。


      次のスクリプトは、先ほどの例と同じ Trap ステートメントを含んでいます。ただ
      し、エラーの内容は異なります。

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


      このスクリプトを実行すると、次のような結果になります。

          Other terminating error trapped
          0 で除算しようとしました。
          発生場所 C:PS> errorX.ps1:3 文字:7
          +   1/ <<<< $null


      ゼロ除算では、CommandNotFoundException エラーになりません。このエラーは、
      もう 1 つの (すべての終了エラーをトラップする) Trap ステートメントによって
      トラップされます。


  エラーのトラップとスコープ

      Trap ステートメントと同じスコープで終了エラーが発生した場合、Trap ステート
      メントの実行後、そのエラーの次のステートメントから処理が続行されます。Trap 
      ステートメントがエラーとは異なるスコープに存在する場合は、その Trap ステー
      トメントと同じスコープ内の次のステートメントから処理が続行されます。
 

      たとえば、関数内でエラーが発生したとき、同じ関数の中に Trap ステートメント
      が存在する場合は、エラー発生箇所の次のステートメントから、スクリプトの処理
      が続行されます。たとえば、次のスクリプトには、エラーと Trap ステートメント
      が含まれます。

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


      Function1 関数を実行すると、スクリプトの後半で、次のような結果が表示されます。

          function1
          An error:
          文字列 'NonsenseString' は、コマンドレット、関数、スクリプト ファイル、
          または操作可能なプログラムの名前として認識されません。名前が正しく記述
          されていることを確認し、パスが含まれている場合はそのパスが正しいことを
          確認してから、再試行してください。
          発生場所 C:\PS>TestScript1.ps1:3 文字:19
          +   NonsenseString <<<<

          function1 was completed
 

      このエラーは、関数内の Trap ステートメントによってトラップされています。Wi
      ndows PowerShell は、メッセージを表示した後、関数の実行を再開します。Funct
      ion1 が最後まで実行されていることに注目してください。


      これを次の例と比較してみてください。次の例にも、同じエラーと Trap ステート
      メントが含まれています。先ほどの例と異なるのは、Trap ステートメントが、関
      数の外に置かれている点です。

          function function2 {
              NonsenseString
              "function2 was completed"
              }

          trap { "An error: " }
              . . .
          function2


      Function2 関数を実行すると、スクリプトの後半で、次のような結果が表示されます。

          An error:
          文字列 'NonsenseString' は、コマンドレット、関数、スクリプト ファイル、
          または操作可能なプログラムの名前として認識されません。名前が正しく記述
          されていることを確認し、パスが含まれている場合はそのパスが正しいことを
          確認してから、再試行してください。
          発生場所 C:\PS>TestScript2.ps1:4 文字:19
          +   NonsenseString <<<<


      この例では、"function2 was completed" コマンドは実行されません。どちらの終
      了エラーも関数の内部で発生していますが、Trap ステートメントが関数の外に置
      かれている場合、Windows PowerShell は、Trap ステートメントの実行後、再度、
      関数内に戻ることはありません。


  Break キーワードと Continue キーワードの使用

      Trap ステートメントで Break キーワードと Continue キーワードを使用すること
      により、終了エラーの発生後にスクリプトまたはコマンドの実行を続けるかどうか
      を制御できます。


      一連の Trap ステートメントに Break ステートメントを追加した場合、Windows P
      owerShell は、関数またはスクリプトの実行を中止します。Trap ステートメントに 
      Break キーワードを使用した関数の例を次に示します。

          C:\PS> function break_example {
              trap {"Error trapped"; break;}
              1/$null
              "Function completed."
              }

          C:\PS> break_example
          Error trapped
          0 で除算しようとしました。
          行:4 文字:7


      Trap ステートメントに Break キーワードが含まれているので、関数はそこで実行
      を中止し、"Function completed" の行は実行されません。


      Trap ステートメントに Continue ステートメントを追加した場合、Windows Power
      Shell は、エラーの原因となったステートメントの後から実行を再開します。これ
      は、Break も Continue も指定しなかった場合と同じ動作になります。ただし、Co
      ntinue キーワードを指定した場合、Windows PowerShell は、エラー ストリーム
      への書き込みを行いません。


      Trap ステートメントに Continue キーワードを使用した関数の例を次に示します。

          C:\PS> function continue_example {
              trap {"Error trapped"; continue;}
              1/$null
              "Function completed."}

          C:\PS> continue_example
          Error trapped
          Function completed.


      エラーのトラップ後、関数が再開され、"Function completed" ステートメントが実
      行されます。エラー ストリームには何のエラーも書き込まれません。


関連項目
    about_Break
    about_Continue
    about_Throw
    about_Try_Catch_Finally
    about_Scopes
    	
記事で解説しているパソコンの環境
 基本ソフト: Windows 7
 キーワード: Windows PowerShell、ヘルプ、HelpFile、about_trap
ご利用数: 1918549
感想・要望・問い合わせは こちら