• 04/01/2019
  • 6分読む
    • S
    • s
    • c

簡単な説明

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

長い説明

TryCatch、およびFinallyブロックを使用して、スクリプト内のterminatingerrorsに応答または処理します。 また、Trapステートメントを使用して、スクリプト内のterminatingerrorsを処理することもできます。 詳細については、”about_Trap”を参照してください。

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

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

ACatchブロックには、エラーを追跡するためのコマンドまたはスクリプトの予想されるフローを回復するためのコマンドを含めることができます。 Catchブロックは、typesitがどのエラーをキャッチするかを指定できます。 Tryステートメントには、異なる種類のエラーに対して複数のCatchブロックを含めることができます。

Finallyブロックを使用すると、スクリプトによって不要になったリソースを解放できます。,

Try, Catch, and Finally resemble the Try, Catch, and Finallykeywords used in the C# programming language.

SYNTAX

A Try statement contains a Try block, zero or more Catch blocks, and zeroor one Finally block. A Try statement must have at least one Catch blockor one Finally block.,

以下は、Tryブロック構文を示しています。

try {<statement list>}

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

以下は、Catchブロック構文を示しています。

catch *] {<statement list>}

エラータイプは角かっこで表示されます。, 最も外側の角かっこは、要素isoptionalを示しています。

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

Catchブロックは、一つ以上のエラータイプを指定できます。 エラーの種類は、aMicrosoft.Net Framework例外またはaから派生した例外です。,NETFramework例外。 ACatchブロックは、指定されたエラーを処理します。NETFramework例外クラス、または指定されたクラスから派生する任意のクラス。

Catchブロックがエラータイプを指定している場合、そのCatchブロックはそのエラータイプを処理します。 Catchブロックがエラータイプを指定しない場合、そのCatchブロックはTryブロックで発生したエラーを処理します。, Tryステートメントは、指定された異なるエラータイプの複数のCatchブロックを含めることができます。

以下は、Finallyブロック構文を示しています。

finally {<statement list>}

Finallyキーワードの後には、Tryステートメントがエラーなしで実行されたか、ステートメント。

CTRL+Cを押すとパイプラインが停止することに注意してください。, パイプラインに送信されるオブジェクトは出力として表示されません。 したがって、”Finally block has run”など、表示する文を含めると、Finallyブロックが実行された場合でも、CTRL+Cを押した後に表示されません。

キャッチエラー

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

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

CatchキーワードはTryブロックまたは別のCatchブロック。,

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

An error occurred.

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

複数のCATCHステートメントを使用する

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

最初のCatchブロックはSystem.Net.WebExceptionおよびsystem.IO.IOExceptionタイプのエラーを処理します。 第二のCatchブロックはエラータイプを指定しません。 第二のCatchブロックは、発生する他の終了エラーを処理します。

PowerShellは継承によってエラータイプと一致します。 ACatchブロックは、指定されたエラーを処理します。,NET Framework例外クラスまたは指定されたクラスから派生する任意のクラスの。 次の例には、Catch“コマンドが見つかりません”エラーをキャッチするブロックが含まれています。

catch {"Inherited Exception" }

指定されたエラータイプCommandNotFoundExceptionは、システムSystemExceptionタイプ。 次の例では、CommandNot Foundエラーもキャッチします。

catch {"Base Exception" }

このCatchブロックは、”Command Not Found”エラーとSystemException型から継承されるその他のエラーを処理します。,

エラークラスとその派生クラスのいずれかを指定する場合は、派生クラスのCatchブロックを、一般クラスのCatchブロック

Try Catchでトラップを使用する

TryTrapTryブロック内に定義されたCatchブロック内にCatchブロックがあっても、Tryブロック内に終了エラーが発生した場合、Trapステートメントはコントロールを取ります。,

TrapTryよりも高いブロックに存在し、現在のスコープ内に一致するCatchブロックがない場合、Trapは、親スコープに一致する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 pathwas 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を使用してリソースを解放する

スクリプトで使用されるリソースを解放するには、FinallyおよびCatchブロック。, Finallyブロックステートメントは、Tryブロックで終了エラーが発生したかどうかに関係なく実行されます。 PowerShellは、スクリプトが終了する前、または現在のブロックがスコープ外になる前に、Finallyブロックを実行します。

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

も参照してください

about_Break

about_Continue

about_Scopes

about_Throw

about_Trap