about_Try_Catch_Finally
簡単な説明
、、ブロックfinally
を使用try
catch
して終了エラーを処理する方法について説明します。
詳細な説明
、catch
、およびfinally
ブロックを使用try
して、スクリプト内の終了エラーに応答または処理します。 ステートメントを 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
ブロックを使用すると、スクリプトで不要になったリソースを解放できます。
try
、catch
、および finally
C# プログラミング言語で使用されるキーワード (keyword)に似ていますtry
catch
finally
。
構文
try
ステートメントには、try
ブロック、0 個以上catch
のブロック、および 0 または 1 のブロックがfinally
含まれています。 ステートメントには try
、少なくとも 1 つのブロックまたは 1 つの catch
ブロックが finally
必要です。
ブロック構文を次に try
示します。
try {<statement list>}
try
キーワード (keyword)の後に中かっこで囲まれるステートメント リストが続きます。 ステートメント リスト内のステートメントの実行中に終了エラーが発生した場合、スクリプトはエラー オブジェクトをブロックから try
適切な catch
ブロックに渡します。
ブロック構文を次に catch
示します。
catch [[<error type>][',' <error type>]*] {<statement list>}
エラーの種類は角かっこで囲まれています。 最も外側の角かっこは、要素が省略可能であることを示します。
catch
キーワード (keyword)の後に、オプションのエラー・タイプ仕様のリストとステートメント・リストが続きます。 ブロックで try
終了エラーが発生した場合、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
キーワード (keyword)の後には、ステートメントがエラーなしで実行された場合や、ステートメントでcatch
エラーがキャッチされた場合try
でも、スクリプトが実行されるたびに実行されるステートメント リストが続きます。
Ctrl C キー+を押すとパイプラインが停止されることに注意してください。 パイプラインに送信されたオブジェクトは出力として表示されません。 そのため、"Finally block has run" などの表示するステートメントを含めた場合、ブロックが実行された場合finally
でも、Ctrl C キー+を押しても表示されません。
エラーのキャッチ
次のサンプル スクリプトは、ブロックを含む try
ブロックを catch
示しています。
try { NonsenseString }
catch { "An error occurred." }
キーワード (keyword)は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
の ブロックは、System.Net.WebException 型と System.IO.IOException 型のエラーを処理します。 2 番目 catch
のブロックでは、エラーの種類が指定されていません。 2 番目 catch
のブロックは、発生した他の終了エラーを処理します。
PowerShell は、継承によってエラーの種類と一致します。 ブロックは、 catch
指定した .NET Framework 例外クラスまたは指定したクラスから派生したクラスのエラーを処理します。 次の例には、 catch
"Command Not Found" エラーをキャッチするブロックが含まれています。
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
指定したエラーの種類である CommandNotFoundException は、System.SystemException 型を継承します。 次の例では、コマンドが見つからないエラーもキャッチします。
catch [System.SystemException] {"Base Exception" }
このブロックはcatch
、"Command Not Found" エラーと、SystemException 型を継承するその他のエラーを処理します。
エラー クラスとその派生クラスの 1 つを指定する場合は、派生クラスの catch
ブロックを一般クラスのブロックの catch
前に配置します。
Note
PowerShell では、RuntimeException 型のすべての例外がラップされます。 したがって、エラーの種類 System.Management.Automation.RuntimeException を指定すると、修飾されていない catch ブロックと同じように動作します。
Try Catch でのトラップの使用
ブロック内try
に定義されたブロックTrap
でtry
終了エラーが発生した場合、一致するcatch
ブロックがある場合でも、ステートメントが制御をTrap
受け取ります。
a Trap
が 、現在のスコープ内に一致するブロックtry
がない場合、Trap
親スコープに一致catch
catch
するブロックがある場合でも、制御が行われます。
例外情報へのアクセス
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.
ScriptStackTrace、Exception、ErrorDetails など、アクセスできる追加のプロパティがあります。 たとえば、スクリプトを次のように変更するとします。
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
結果は次のようになります。
An Error occurred:
at <ScriptBlock>, <No file>: line 2
finally を使用したリソースの解放
スクリプトで使用されるリソースを解放するには、and ブロックの後にfinally
ブロックをtry
catch
追加します。 ブロック ステートメントは finally
、ブロックで終了エラーが try
発生したかどうかに関係なく実行されます。 スクリプトが終了する finally
前、または現在のブロックがスコープ外になる前に、PowerShell によってブロックが実行されます。
finally
Ctrl C キー+を使用してスクリプトを停止した場合でも、ブロックが実行されます。 ブロックはfinally
、Exit キーワード (keyword)がブロック内catch
からスクリプトを停止した場合にも実行されます。
関連項目
PowerShell