簡単な説明
終了エラーを処理するキーワードについて説明します。
長い説明
終了エラーは、ステートメントの実行を停止します。 PowerShell が何らかの方法で終了エラーを処理しない場合、PowerShell は現在のパイプラインでの関数またはスクリプトの実行も停止します。 C# などの他の言語では、終了エラーは例外と呼ばれます。
trap キーワードは、終了エラーが発生したときに実行するステートメントの一覧を指定します。
trap ステートメントは、次の方法で終了エラーを処理できます。
trapステートメント ブロックを処理し、trapを含むスクリプトまたは関数の実行を継続した後、エラーを表示します。 これが既定の動作です。注
ifステートメントやforeachループなどの下位スクリプト ブロックで終了エラーが発生すると、trapブロック内のステートメントが実行され、下位スクリプト ブロックの外部にある次のステートメントで実行が続行されます。trapステートメントでbreakを使用して、trapを含むスクリプトまたは関数のエラーと中止の実行を表示します。エラーを無音にしますが、
trapステートメントでcontinueを使用して、trapを含むスクリプトまたは関数の実行を続行します。
trap のステートメント リストには、複数の条件または関数呼び出しを含めることができます。
trap では、ログの書き込み、テスト条件、または別のプログラムの実行を行うことができます。
構文
trap ステートメントには、次の構文があります。
trap [[<error type>]] {<statement list>}
trap ステートメントには、終了エラーが発生したときに実行するステートメントの一覧が含まれています。
trap ステートメントは、trap キーワードと、必要に応じて型式、およびエラーがトラップされたときに実行するステートメントの一覧を含むステートメント ブロックで構成されます。 型式は、trap がキャッチするエラーの種類を調整します。
スクリプトまたはコマンドには、複数の trap ステートメントを含めることができます。
trap ステートメントは、スクリプトまたはコマンド内の任意の場所に表示できます。
すべての終了エラーをトラップする
スクリプトまたはコマンドで別の方法で処理されない終了エラーが発生した場合、PowerShell はエラーを処理する trap ステートメントを確認します。
trap ステートメントが存在する場合、PowerShell は trap ステートメントでスクリプトまたはコマンドの実行を続行します。
次の例は、非常に単純な trap ステートメントです。
trap {"Error found."}
この trap ステートメントは、終了エラーをトラップします。
次の例では、ランタイム エラーの原因となるナンセンス文字列が関数に含まれています。
function TrapTest {
trap {"Error found."}
nonsenseString
}
TrapTest
この関数を実行すると、次の結果が返されます。
Error found.
nonsenseString:
Line |
3 | 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.
次の例には、trap 自動変数を使用してエラーを表示する $_ ステートメントが含まれています。
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 try again.
nonsenseString:
Line |
3 | 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.
Von Bedeutung
trap ステートメントは、特定のスコープ内の任意の場所で定義できますが、常にそのスコープ内のすべてのステートメントに適用されます。 実行時に、ブロック内の trap ステートメントは、他のステートメントが実行される前に定義されます。 これは JavaScript でホイスティングと呼ばれます。 つまり、 trap ステートメントは、定義されたポイントを超えて実行が進行していない場合でも、そのブロック内のすべてのステートメントに適用されます。 たとえば、スクリプトの最後に trap を定義し、最初のステートメントでエラーをスローする場合も、その trap がトリガーされます。
特定のエラーの捕捉
スクリプトまたはコマンドには、複数の trap ステートメントを含めることができます。 特定のエラーを処理するために、trap を定義できます。
次の例は、CommandNotFoundException trap特定のエラーをトラップする ステートメントです。
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
関数またはスクリプトで既知のコマンドと一致しない文字列が検出された場合、この trap ステートメントは "コマンド エラー トラップされました" 文字列を表示します。
trap ステートメント の一覧を実行した後、PowerShell はエラー オブジェクトをエラー ストリームに書き込み、スクリプトを続行します。
PowerShell では、.NET 例外の種類が使用されます。 次の例では、System.Exception エラーの種類を指定します。
trap [System.Exception] {"An error trapped"}
CommandNotFoundException エラーの種類は、System.Exception 型から継承されます。 この文は、不明なコマンドによって作成されたエラーをトラップします。 また、他のエラーの種類もトラップします。
スクリプトには複数の trap ステートメントを含めることができます。 各エラー・タイプは、1 つの trap ステートメントによってのみトラップできます。 終了エラーが発生すると、PowerShell は、現在の実行スコープから最も具体的な一致を持つ trap を検索します。
次のスクリプト例には、エラーが含まれています。 このスクリプトには、終了エラーをトラップする一般的な trap ステートメントと、trap 型を指定する特定の ステートメントが含まれています。
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
"Command error trapped"
}
nonsenseString
このスクリプトを実行すると、次の結果が生成されます。
Command error trapped
nonsenseString:
Line |
5 | 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.
PowerShell は "nonsenseString" をコマンドレットまたはその他の項目として認識しないため、 CommandNotFoundException エラーを返します。 この終了エラーは、特定の trap ステートメントによってトラップされます。
次のスクリプト例には、同じ trap ステートメントが含まれていますが、エラーは異なります。
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
1/$null
このスクリプトを実行すると、次の結果が生成されます。
Other terminating error trapped
RuntimeException:
Line |
4 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
0 で除算しようとしても 、CommandNotFoundException エラーは発生しません。 代わりに、そのエラーは他の trap ステートメントによってトラップされ、終了エラーがトラップされます。
スクリプトブロックにおけるエラー捕捉
既定では、終了エラーがスローされると、実行はトラップ ステートメントに移ります。
trap ブロックが実行されると、エラーの場所の後の次のステートメント ブロックに制御が戻ります。
たとえば、foreach ステートメントで終了エラーが発生すると、trap ステートメントが実行され、foreach ブロック内ではなく、foreach ブロックの後の次のステートメントで実行が続行されます。
trap { 'An error occurred!'}
foreach ($x in 3..0) {
1/$x
'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException: untitled:Untitled-1:3:4
Line |
3 | 1/$x
| ~~~~
| Attempted to divide by zero.
after loop
上の出力では、ループが最後の反復まで続いていることがわかります。
スクリプトが 1 を 0 で除算しようとすると、終了エラーがスローされます。
foreach スクリプトブロックの残りの部分はスキップされ、try ステートメントが実行され、スクリプトブロックforeach の後もスクリプトが続行されます。
エラーのトラップとスコープ
trap ステートメントと同じスコープで終了エラーが発生した場合、PowerShell は trap で定義されているステートメントの一覧を実行します。 エラーの後、ステートメントで実行が続行されます。
trap ステートメントがエラーと異なるスコープにある場合、trap ステートメントと同じスコープにある次のステートメントから実行が続行されます。
たとえば、関数でエラーが発生し、trap ステートメントが関数内にある場合、スクリプトは次のステートメントで続行されます。 次のスクリプトには、エラーと trap ステートメントが含まれています。
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
function1
このスクリプトを実行すると、次の結果が生成されます。
An error:
NonsenseString:
Line |
3 | 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.
function1 was completed
関数内の trap ステートメントによってエラーがトラップされます。 メッセージを表示すると、PowerShell は関数の実行を再開します。
Function1が完了しました。
これを、同じ error ステートメントと trap ステートメントを持つ次の例と比較します。 この例では、trap ステートメントは関数の外部で発生します。
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
function2
Function2 関数を実行すると、次の結果が生成されます。
An error:
NonsenseString:
Line |
2 | 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.
この例では、"function2 が完了しました" コマンドは実行されていません。 どちらの例でも、終了エラーは関数内で発生します。 ただし、この例では、trap ステートメントは関数の外部にあります。 PowerShell は、 trap ステートメントの実行後に関数に戻りません。
注意事項
同じエラー条件に対して複数のトラップが定義されている場合は、語彙的に定義された最初の trap (スコープ内で最も高い) が使用されます。
次の例では、「whoops 1」の trap のみが実行されます。
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
Von Bedeutung
Trap ステートメントのスコープは、コンパイルされる場所に設定されます。 関数またはドットソーススクリプト内に trap ステートメントがある場合、関数またはドットソーススクリプトが終了すると、内部のすべての trap ステートメントが削除されます。
break キーワードと continue キーワードの使用
break ステートメントの continue キーワードと trap キーワードを使用して、終了エラーの後もスクリプトまたはコマンドが引き続き実行されるかどうかを判断できます。
break ステートメントの一覧に trap ステートメントを含める場合、PowerShell は関数またはスクリプトを停止します。 次のサンプル関数では、break ステートメントで trap キーワードを使用します。
function break_example {
trap {
"Error trapped"
break
}
1/$null
"Function completed."
}
break_example
Error trapped
ParentContainsErrorRecordException:
Line |
6 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
trap ステートメントに break キーワードが含まれているため、関数は実行されず、"Function completed" 行は実行されません。
continue ステートメントに trap キーワードを含めると、エラーの原因となったステートメントの後に、break や continueがない場合と同様に、PowerShell が再開されます。 ただし、 continue キーワードを使用すると、PowerShell はエラー ストリームにエラーを書き込みません。
次のサンプル関数では、continue ステートメントで trap キーワードを使用します。
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
エラーがトラップされた後、関数は再開され、"Function completed" ステートメントが実行されます。 エラー ストリームにエラーは書き込まれなくなります。
注記
trap ステートメントは、スコープ内のすべての終了エラーが処理されることを広範に確認する簡単な方法を提供します。 より詳細なエラー処理を行うには、try ステートメントを使用してトラップが定義されている /catchcatch ブロックを使用します。
catch ステートメントは、関連付けられている try ステートメント内のコードにのみ適用されます。 詳細については、 about_Try_Catch_Finallyを参照してください。