PowerShell HelpFile - about_try_catch_finally
 記事記号:[me1589] 初版:2011/May/10

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

トピック
    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 ブロックも Tr
    ap ステートメントも見つからなかった場合は、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 PowerS
      hell は該当する 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 キーが押された場合は、仮に Fin
      ally ブロックが実行されたとしても、そのテキストは表示されません。


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

          try { NonsenseString }
          catch { "An error occurred."}


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


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

          An error occurred.


      スクリプトで "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]
          {
              "Unable to download MyDoc.doc from http://www.contoso.com."
          }
          catch
          {
              "An error occurred that could not be resolved."
          }


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


      Windows PowerShell がエラーの型を照合する際は、継承関係が考慮されます。Cat
      ch ブロックでは、指定された .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" エラーだけでなく、SystemExcep
      tion 型を継承する他のエラーも処理できます。


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


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


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


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