about_Try_Catch_Finally

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0

トピック

about_Try_Catch_Finally

概要

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

詳細説明

Try、Catch、および Finally ブロックは、スクリプトで終了エラーに応答または処理するために使用します。Trap ステートメントを使用して、スクリプトで終了エラーを処理することもできます。詳細については、「about_Trap」を参照してください。

終了エラーが発生すると、ステートメントの実行が停止します。Windows PowerShell® は、いかなる方法でも終了エラーを処理せず、Windows PowerShell は、現在のパイプラインを使用して、関数またはスクリプトの実行を停止します。C# などのその他の言語では、終了エラーは例外と呼ばれます。エラーの詳細については、「about_Errors」を参照してください。

Try ブロックを使用して、Windows PowerShell でエラーを監視するスクリプトのセクションを定義します。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 ステートメントには、Try ブロック、0 個以上の Catch ブロック、ゼロ個または 1 個の Finally ブロックが含まれます。Try ステートメントには、少なくとも 1 つの Catch ブロックまたは Finally ブロックが必要です。

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

          try {<statement list>}

Try キーワードには、中かっこの中にステートメントのリストが続きます。ステートメント リスト内のステートメントの実行中に終了エラーが発生した場合、スクリプトは Try ブロックから適切な Catch ブロックにエラー オブジェクトを渡します。

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

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

エラーの種類は角かっこの中に記載します。最も外側の角かっこは、要素が省略可能であることを示します。

Catch キーワードには、オプションのエラー タイプの指定とステートメント リストが続きます。Try ブロックで終了エラーが発生した場合、Windows PowerShell は適切な Catch ブロックを検索します。いずれかが見つかった場合は、Catch ブロック内のステートメントが実行されます。

Catch ブロックでは、1 つ以上のエラー タイプを指定できます。エラー タイプは、Microsoft .NET Framework 例外か、.NET Framework 例外から派生した例外です。Catch ブロックは、指定した .NET Framework 例外クラスか、指定したクラスから派生した任意のクラスのエラーを処理します。

Catch ブロックでは、Catch ブロックで処理するエラーの種類を指定します。Catch ブロックでエラーの種類を指定しない場合、その Catch ブロックは、Try ブロック内で発生するすべてのエラーを処理します。Try ステートメントには、指定した異なるエラー型のための Catch ブロックを含めることができます。

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

          finally {<statement list>}

Finally キーワードの後には、スクリプトが実行されるたびに実行されるステートメント リストが続きます。このステートメント リストは、Try ステートメントがエラーなく実行された場合や、Catch ステートメントでエラーがキャッチされた場合でも必ず実行されます。

Ctrl キーを押しながら C キーを押すと、パイプラインが停止することに注意してください。パイプラインに送信されるオブジェクトは、出力として表示されません。そのため、「Finally block has run」のように表示するステートメントを追加すると、Ctrl キーを押しながら C キーを押した後は、Finally ブロックが実行された場合でも表示されません。

エラーのキャッチ

次のサンプル スクリプトは、Try ブロックと Catch ブロックを示しています。

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

Catch キーワードのすぐ後には、Try ブロックまたは別の Catch ブロックを続ける必要があります。

Windows PowerShell は、「NonsenseString」をコマンドレットまたはその他の項目として認識しません。このスクリプトを実行すると、次の結果が返されます。

          An error occurred.

スクリプトで「NonsenseString」が見つかると、終了エラーが発生します。Catch ブロックが、ブロック内のステートメント リストを実行して、エラーを処理します。

複数の Catch ステートメントの使用

Try ステートメントには、任意の数の Catch ブロックを含めることができます。たとえば、次のスクリプトには、MyFile.doc をダウンロードする Try ブロックがあり、2 つの Catch ブロックが含まれています。

          try
          {
             $wc = new-object System.Net.WebClient
             $wc.DownloadFile("https://www.contoso.com/MyDoc.doc")
          }
          catch [System.Net.WebException],[System.IO.IOException]
          {
              "Unable to download MyDoc.doc from https://www.contoso.com."
          }
          catch
          {
              "An error occurred that could not be resolved."
          }

最初の Catch ブロックは、System.Net.WebException 型と System.IO.IOException 型のエラーを処理します。2 番目の Catch ブロックでは、エラーの型が指定されていません。2 番目の 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 ブロックを実行します。

Finally ブロックは、CTRL + C を使用してスクリプトを停止した場合でも実行されます。また、Finally ブロックは、Exit キーワードで Catch ブロック内からスクリプトを停止した場合も実行されます。

関連項目

about_Break

about_Continue

about_Scopes

about_Throw

about_Trap