次の方法で共有


トラップについて

簡単な説明

終了エラーを処理するキーワードについて説明します。

長い説明

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

キーワードは、 Trap 終了エラーが発生したときに実行するステートメントのリストを指定します。 トラップステートメントは、終了エラーを処理し、スクリプトまたは関数の実行を停止せずに続行できるようにします。

トラップステートメントもより複雑になる場合があります。 トラップのステートメント一覧には、複数の条件または関数呼び出しを含めることができます。 トラップは、ログやテスト条件を書き込んだり、別のプログラムを実行したりすることができます。

構文

Trap ステートメントには、次の構文があります。

trap [[<error type>]] {<statement list>}

Trap ステートメントには、終了エラーが発生したときに実行するステートメントのリストが含まれています。 トラップステートメントは、キーワード、 trap オプションで型式、およびエラーがトラップされたときに実行するステートメントのリストを含むステートメントブロックで構成されます。 型式は、トラップがキャッチするエラーの種類を指定します。

スクリプトまたはコマンドには、複数のトラップステートメントを含めることができます。 トラップステートメントは、スクリプトまたはコマンド内の任意の場所に置くことができます。

すべての終了エラーのトラップ

スクリプトまたはコマンドで別の方法で処理されない終了エラーが発生した場合、PowerShell はエラーを処理するトラップステートメントを確認します。 トラップステートメントが存在する場合、PowerShell は、トラップステートメントでスクリプトまたはコマンドの実行を続行します。

次の例は、非常に単純なトラップステートメントです。

trap {"Error found."}

この Trap ステートメントは、終了エラーをトラップします。

次の例では、関数に、実行時エラーの原因となる文字列が含まれています。

function TrapTest {
    trap {"Error found."}
    nonsenseString
}

TrapTest

この関数を実行すると、次の値が返されます。

Error found.

次の例には、自動変数を使用してエラーを表示するトラップステートメントが含まれてい $_ ます。

function TrapTest {
    trap {"Error found: $_"}
    nonsenseString
}

TrapTest

このバージョンの関数を実行すると、次の値が返されます。

Error found: 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 then try
again.

重要

トラップステートメントは、特定のスコープ内の任意の場所で定義できますが、常にそのスコープ内のすべてのステートメントに適用されます。 実行時には、他のすべてのステートメントが実行される前に、ブロック内のトラップが定義されます。 JavaScript では、これはhoistingと呼ばれます。 これは、定義された時点を超えて実行が進んでいない場合でも、そのブロック内のすべてのステートメントにトラップが適用されることを意味します。 たとえば、スクリプトの最後にトラップを定義し、最初のステートメントでエラーをスローしても、そのトラップがトリガーされます。

特定のエラーのトラップ

スクリプトまたはコマンドには、複数のトラップステートメントを含めることができます。 トラップは、特定のエラーを処理するように定義できます。

次の例は、特定のエラー CommandNotFoundExceptionをトラップするトラップステートメントです。

trap [System.Management.Automation.CommandNotFoundException]
    {"Command error trapped"}

関数またはスクリプトで、既知のコマンドと一致しない文字列が検出されると、このトラップステートメントでは "Command error トラップ" という文字列が表示されます。 ステートメントの一覧を実行 Trap すると、PowerShell によってエラーオブジェクトがエラーストリームに書き込まれ、スクリプトが続行されます。

PowerShell では、Microsoft .NET Framework の例外の種類が使用されます。 次の例では、 system.exceptionエラーの種類を指定します。

trap [System.Exception] {"An error trapped"}

CommandNotFoundExceptionエラーの種類は、 system.exception型から継承されます。 このステートメントは、不明なコマンドによって作成されたエラーをトラップします。 また、他のエラーの種類をトラップします。

1つのスクリプトに複数のトラップステートメントを含めることができます。 各エラーの種類は、トラップステートメントを1つだけトラップできます。 終了エラーが発生すると、PowerShell は、現在の実行スコープから順に、最も限定的な一致を持つトラップを検索します。

次のスクリプトの例には、エラーが含まれています。 このスクリプトには、終了エラーをトラップする一般的なトラップステートメントと TrapCommandNotFoundException型を指定する特定のステートメントが含まれています。

trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
  "Command error trapped"
}
nonsenseString

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

Command error trapped
nonsenseString : 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.
At C:\temp\test\traptest.ps1:5 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo          : ObjectNotFound: (nonsenseString:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

PowerShell はコマンドレットまたはその他の項目として "nonsenseString" を認識しないため、 CommandNotFoundExceptionエラーが返されます。 この終了エラーは、特定のトラップステートメントによってトラップされます。

次のスクリプトの例には、同じトラップステートメントと、別のエラーが含まれています。

trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
    {"Command error trapped"}
1/$null

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

Other terminating error trapped
Attempted to divide by zero.
At C:\temp\test\traptest.ps1:5 char:1
+ 1/$null
+ ~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException

0で除算しようとしても、 CommandNotFoundExceptionエラーは発生しません。 代わりに、そのエラーは、終了エラーをトラップするもう1つのトラップステートメントによってトラップされます。

エラーとスコープのトラップ

終了エラーがトラップステートメントと同じスコープ内で発生した場合、PowerShell は、トラップによって定義されたステートメントの一覧を実行します。 実行は、エラーの後のステートメントから続行されます。 トラップステートメントがエラーとは異なるスコープにある場合、実行は、トラップステートメントと同じスコープ内にある次のステートメントから続行されます。

たとえば、関数でエラーが発生し、トラップステートメントが関数内にある場合、スクリプトは次のステートメントで続行されます。 次のスクリプトには、エラーとトラップステートメントが含まれています。

function function1 {
    trap { "An error: " }
    NonsenseString
    "function1 was completed"
    }

スクリプトの後半で、Function1 関数を実行すると、次の結果が生成されます。

function1
An error:
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
then try again.
At C:\PS>TestScript1.ps1:3 char:19
+     NonsenseString <<<<

function1 was completed

関数の Trap ステートメントは、エラーをトラップします。 メッセージを表示すると、PowerShell によって関数の実行が再開されます。 が完了したことに注意 Function1 してください。

これを次の例と比較します。この例では、同じエラーとステートメントが使用されてい Trap ます。 この例では、トラップステートメントが関数の外側にあります。

function function2 {
    NonsenseString
    "function2 was completed"
    }

trap { "An error: " }

function2

関数を実行する Function2 と、次の結果が生成されます。

An error:
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
then try again.
At C:\PS>TestScript2.ps1:4 char:19
+     NonsenseString <<<<

この例では、"function2 was completed" コマンドは実行されませんでした。 どちらの例でも、関数内で終了エラーが発生します。 ただし、この例では、Trap ステートメントは関数の外にあります。 PowerShell は、トラップステートメントの実行後に関数に戻りません。

注意事項

同じエラー条件に対して複数のトラップが定義されている場合、最初に定義されたトラップ (スコープ内で最も高いトラップ) が使用されます。

次の例では、"そのような ops 1" を持つトラップだけが実行されます。

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }

breakキーワードとキーワードの使用 continue

Breakトラップステートメントでキーワードとキーワードを使用すると、 Continue 終了エラーが発生した後もスクリプトまたはコマンドの実行を継続するかどうかを判断できます。

Breakトラップステートメントの一覧にステートメントを含めると、PowerShell は関数またはスクリプトを停止します。 次のサンプル関数では、トラップステートメントでキーワードを使用してい Break ます。

function break_example {
    trap {
        "Error trapped"
        break
    }
    1/$null
    "Function completed."
}

break_example
Error trapped
Attempted to divide by zero.
At line:4 char:7

Trap ステートメントにキーワードが含まれているため、 Break 関数は実行を続行せず、"関数は完了しました" 行は実行されません。

Continueトラップステートメントにステートメントを含めると、またはを使用しない場合と同様に、エラーの原因となったステートメントの後に PowerShell が再開され Break Continue ます。 ただし、キーワードを使用すると、エラー Continue ストリームにエラーが書き込まれません。

次のサンプル関数では、ステートメントでキーワードを使用してい Continue Trap ます。

function continue_example {
    trap {
        "Error trapped"
        continue
    }
    1/$null
    "Function completed."
}

continue_example
Error trapped
Function completed.

関数は、エラーがトラップされ、"関数が完了しました" ステートメントが実行された後に再開されます。 エラーストリームにはエラーが書き込まれません。

Notes

トラップステートメントを使用すると、スコープ内のすべての終了エラーを広範囲に処理することができます。 より詳細なエラー処理を行うには、 try / catch ステートメントを使用してトラップが定義されているブロックを使用し Catch ます。 ステートメントは、 Catch 関連付けられているステートメント内のコードにのみ適用され Try ます。 詳細については、「 about_Try_Catch_Finally」を参照してください。

関連項目

about_Break

about_Continue

about_Scopes

about_Throw

about_Try_Catch_Finally