トピック
    about_Try_Catch_Finally

簡易説明
    Try、Catch、Finally の各ブロックを使用して終了エラーを処理する方法について説明します。


詳細説明
    スクリプトで終了エラーが発生した場合に、何かの応答を返したり、エラーを処理したりするには、
    Try、Catch、Finally の各ブロックを使用します。Trap ステートメントを使用して、スクリプト
    の終了エラーを処理することもできます。詳細については、「about_Trap」を参照してください。


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


    Try ブロックは、スクリプトの中でエラーを監視する部分を定義します。Try ブロックでエラーが
    発生すると、そのエラーがまず $Error 自動変数に保存されます。次に、Windows PowerShell 
    がエラーを処理する Catch ブロックを探します。Try ステートメントに対応する Catch ブロッ
    クが存在しない場合、Windows PowerShell は、引き続き上位のスコープを対象に、該当する 
    Catch ブロックまたは Trap ステートメントがないか探します。Catch ブロックが完了するか、
    該当する Catch ブロックも Trap ステートメントも見つからなかった場合は、Finally ブロック
    が実行されます。エラーを処理できなかった場合、そのエラーはエラー ストリームに書き込まれません。


    Catch ブロックには、エラーを追跡するためのコマンドや、スクリプトの流れを適切な状態に回復す
    るためのコマンドを記述することができます。Catch ブロックには、キャッチするエラーの型を指定
    できます。Try ステートメントに複数の Catch ブロックを記述することで、さまざまな種類のエラ
    ーへの対処が可能になります。


    Finally ブロックは、スクリプトで不要になったリソースを解放するために使用します。


    Try、Catch、Finally は、C# プログラミング言語で使用されている Try、Catch、および 
    Finally の各キーワードに似ています。


  構文
      Try ステートメントは、1 個の Try ブロック、0 個以上の Catch ブロック、および 0 個ま
      たは 1 個の Finally ブロックで構成されます。Try ステートメントには、少なくとも 1 個の 
      Catch ブロック、または 1 個の Finally ブロックが存在する必要があります。


      Try ブロックの構文を次に示します。

          try {<statement list>}


      Try キーワードの後には、ステートメント リスト (一連のステートメント) を中かっこで囲んで
      記述します。ステートメント リストのいずれかのステートメントの実行中に終了エラーが発生した
      場合、Try ブロックから適切な Catch ブロックへとエラー オブジェクトが渡されます。


      Catch ブロックの構文を次に示します。

          catch [[<error type>][',' <error type>]*] {<statement list>}


      エラーの型は、角かっこで囲んで記述します。最も外側の角かっこは、要素が省略可能であることを示します。


      Catch キーワードの後には、一連のエラー型の指定 (省略可能) とステートメント リストを記
      述します。Try ブロックで終了エラーが発生した場合、Windows PowerShell は該当する 
      Catch ブロックを検索します。見つかった場合は、Catch ブロックのステートメントが実行され
      ます。


      Catch ブロックには、複数のエラー型を指定することもできます。エラー型には、
      Microsoft .NET Framework の例外か、そこから派生した例外を指定します。Catch ブロック
      では、指定された .NET Framework の例外クラスのエラーだけでなく、指定されたクラスから派
      生したすべてのクラスのエラーが処理されます。


      Catch ブロックでエラー型を指定した場合は、その型のエラーだけが処理されます。Catch ブロ
      ックでエラー型を指定しなかった場合は、Try ブロックで発生したすべてのエラーが処理されま
      す。Try ステートメントに複数の Catch ブロックを記述し、それぞれ異なるエラー型を指定する
      ことができます。


      Finally ブロックの構文を次に示します。

          finally {<statement list>}


      Finally キーワードに続くステートメント リストは、Try ステートメントでエラーが発生した
      かどうかに関係なく (Catch ステートメントでエラーがキャッチされたかどうかに関係なく)、ス
      クリプトを実行すると必ず実行されます。


      Ctrl キーを押しながら C キーを押すと、パイプラインが停止することに注意してください。パ
      イプラインに送られたオブジェクトは出力結果に表示されません。したがって、"Finally block 
      has run" など、何かを表示するようなステートメントが記述されていても、Ctrl キーを押しな
      がら C キーが押された場合は、仮に Finally ブロックが実行されたとしても、そのテキストは
      表示されません。


  エラーのキャッチ
      次のスクリプトは、Catch ブロックを持つ Try ブロックの例です。

          try { NonsenseString }
          catch { "エラーが発生しました。"}


      Catch キーワードは、Try ブロックの直後か、他の Catch ブロックの直後に置く必要があります。


      "NonsenseString" は Windows PowerShell が認識できる項目 (コマンドレットなど) で
      はありません。このスクリプトを実行すると、次の結果が返されます。

          エラーが発生しました。


      スクリプトで "NonsenseString" に遭遇すると、終了エラーが発生します。このエラーは、
      Catch ブロック内のステートメント リストを実行することによって処理されます。


  複数の Catch ステートメントの使用
      Try ステートメントには、Catch ブロックをいくつでも記述できます。たとえば、次のスクリプ
      トには、MyFile.doc をダウンロードする Try ブロックがあり、そこに、2 つの Catch ブロッ
      クが記述されています。

          try
          {
             $wc = new-object System.Net.WebClient
             $wc.DownloadFile("http://www.contoso.com/MyDoc.doc")
          }
          catch [System.Net.WebException],[System.IO.IOException]
          {
              "http://www.contoso.com. から MyDoc.doc をダウンロードできません。"
          }
          catch
          {
              "エラーが発生しました。このエラーは解決できませんでした。"
          }


      1 つ目の Catch ブロックは、System.Net.WebException 型および System.IO.IOException 
      型のエラーを処理します。2 つ目の Catch ブロックには、エラーの型が指定されていません。
      2 つ目の Catch ブロックでは、1 つ目の Catch ブロックでキャッチされなかったすべての
      終了エラーが処理されます。


      Windows PowerShell がエラーの型を照合する際は、継承関係が考慮されます。Catch ブロッ
      クでは、指定された .NET Framework の例外クラスのエラーだけでなく、指定されたクラスから
      派生したすべてのクラスのエラーが処理されます。次の例には、"Command Not Found" エラーを
      キャッチする Catch ブロックがあります。

          catch [System.Management.Automation.CommandNotFoundException] 
              {"Inherited Exception" }


      この例で指定されているエラー型 CommandNotFoundException は、
      System.SystemException 型を継承しています。したがって、次の例のようにしても、
      "Command Not Found" エラーをキャッチすることができます。

          catch [System.SystemException] {"Base Exception" }


      この Catch ブロックでは、"Command Not Found" エラーだけでなく、SystemException 
      型を継承する他のエラーも処理できます。


      特定のエラー クラスに加え、そのいずれかの派生クラスも指定する場合は、まず、派生クラス用
      の Catch ブロックを記述し、その後に、汎用的なクラスの Catch ブロックを記述するようにし
      ます。


  Finally を使用したリソースの解放
      スクリプトによって使用されたリソースを解放するには、Try ブロックと Catch ブロックに続
      けて Finally ブロックを追加します。Finally ブロックにあるステートメントは、Try ブロッ
      クで終了エラーが発生したかどうかに関係なく必ず実行されます。Windows PowerShell によっ
      てまず Finally ブロックが実行され、その後で、スクリプトが終了するか、現在のブロックがス
      コープ外になります。


      Ctrl キーを押しながら C キーを押してスクリプトを中止したとしても、Finally ブロックが
      実行されます。また、Exit キーワードによって、Catch ブロック内からスクリプトが中止された
      場合にも、Finally ブロックが実行されます。


関連項目
    about_Errors
    about_Trap




目次