about_Try_Catch_Finally

簡単な説明

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

長い説明

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

終了エラーにより、ステートメントの実行が停止します。 PowerShell が何らかの方法で終了エラーを処理しない場合、PowerShell は、現在のパイプラインを使用した関数またはスクリプトの実行も停止します。 C # などの他の言語では、終了エラーは例外と呼ばれます。

tryブロックを使用して、PowerShell でエラーを監視するスクリプトのセクションを定義します。 ブロック内で try エラーが発生すると、エラーが最初に自動変数に $Error 保存されます。 次に、PowerShell は、エラーを処理するブロックを検索 catch します。 tryステートメントに一致 catch するブロックがない場合、PowerShell は引き続き、親スコープ内の適切な catch ブロックまたは Trap ステートメントを検索します。 ブロックが完了する catch か、適切な catch ブロックまたは Trap ステートメントが見つから finally ない場合は、ブロックが実行されます。 エラーを処理できない場合は、エラーストリームにエラーが書き込まれます。

catchブロックには、エラーを追跡するコマンドや、想定されるスクリプトのフローを回復するためのコマンドを含めることができます。 ブロックは catch 、キャッチするエラーの種類を指定できます。 ステートメントには、 try さまざまな種類のエラーに対応する複数 catch のブロックを含めることができます。

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

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

構文

ステートメントに try は、ブロック、0個以上 catch のブロック、および0個または 1 finally 個のブロックが含まれてい try ます。 ステートメントには、 try 少なくとも1つ catch のブロックまたは1つ finally のブロックが必要です。

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

try {<statement list>}

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

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

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

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

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

ブロックでは、 catch 1 つまたは複数のエラーの種類を指定できます。 エラーの種類は、Microsoft .NET Framework の例外、または .NET Framework の例外から派生した例外です。 ブロックは catch 、指定された .NET Framework exception クラス、または指定されたクラスから派生した任意のクラスのエラーを処理します。

catchブロックでエラーの種類が指定されている場合、その catch ブロックはエラーの種類を処理します。 catchブロックでエラーの種類が指定されていない場合、ブロックで try 発生したエラーがブロックによって catch 処理されます。 ステートメントに try は、指定されたさまざまなエラーの種類に対して複数 catch のブロックを含めることができます。

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

finally {<statement list>}

キーワードの finally 後には、ステートメントがエラーなしで実行された場合や、ステートメントで catch エラーがキャッチされた場合 try でも、スクリプトが実行されるたびに実行されるステートメントリストが続きます。

CTRL + Cキーを押すと、パイプラインが停止することに注意してください。 パイプラインに送信されたオブジェクトは出力として表示されません。 したがって、表示するステートメント ("Finally ブロックが実行されている" など) を含めると、ブロックが実行された場合 finally でも、 CTRL + Cキーを押しても表示されません。

エラーのキャッチ

次のサンプルスクリプトは、ブロックを含む catch ブロックを try 示しています。

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

キーワードは catch 、ブロックまたは別 catch のブロックの try 直後にある必要があります。

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

An error occurred.

スクリプトが "NonsenseString" を検出すると、終了エラーが発生します。 ブロックは catch 、ブロック内のステートメントリストを実行してエラーを処理します。

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

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

try {
   $wc = new-object System.Net.WebClient
   $wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\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."
}

最初 catch のブロックは、 WebException 型と IOException 型のエラーを処理します。 2番目 catch のブロックでは、エラーの種類が指定されていません。 2つ目 catch のブロックは、発生した他のすべての終了エラーを処理します。

PowerShell は、継承によってエラーの種類と一致します。 ブロックは catch 、指定された .NET Framework exception クラス、または指定されたクラスから派生した任意のクラスのエラーを処理します。 次の例には、"コマンドが見つかりません" というエラーをキャッチするブロックが含まれてい catch ます。

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

指定したエラーの種類 CommandNotFoundException は、 systemexception 型から継承されます。 次の例では、コマンドが見つからないというエラーもキャッチします。

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

この catch ブロックは、"コマンドが見つかりません" エラーと、 systemexception 型から継承する他のエラーを処理します。

エラークラスとその派生クラスの1つを指定する場合は、派生クラスのブロックを汎用クラスのブロックの前に catch 配置 catch します。

注意

PowerShell では、すべての例外が runtimeexception 型でラップされます。 したがって、エラーの種類が "system.string" の場合は、非修飾の catch ブロックと同じ動作が発生 します。

Try Catch でのトラップの使用

ブロック内で定義されたを Trap 持つブロックで try 終了エラーが発生した場合、一致 catch するブロックがある場合でも、ステートメントは Trap 制御を受け取ります。 try

Trapがより try 大きいブロックに存在し、現在のスコープ内に一致する catch ブロックがない場合、親スコープに一致する catch ブロックがある場合でも、 Trap は制御を受け取ります。

例外情報へのアクセス

catchブロック内では、現在のエラーにはと $PSItem も呼ばれるを使用して $_ アクセスできます。 オブジェクトの型は Errorrecord です。

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_
}

このスクリプトを実行すると、次の結果が返されます。

An Error occurred:
The term 'NonsenseString' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.

ScriptStackTraceExceptionerrordetails など、アクセスできるプロパティが追加されています。 たとえば、スクリプトを次のように変更したとします。

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_.ScriptStackTrace
}

結果は次のようになります。

An Error occurred:
at <ScriptBlock>, <No file>: line 2

Finally を使用したリソースの解放

スクリプトで使用されるリソースを解放するには、ブロックと catch ブロックの try 後にブロックを finally 追加します。 ブロックステートメントは finally 、ブロックで try 終了エラーが発生したかどうかに関係なく実行されます。 PowerShell は、スクリプトが終了する前、または現在のブロックがスコープ外になる前に、ブロックを finally 実行します。

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

関連項目