about_Trap
トピック
about_Trap
簡易説明
終了エラーを処理するキーワードについて説明します。
詳細説明
終了エラーが発生すると、ステートメントの実行が中止されます。終了エラーに対して何も処理を行わなかった場
合、Windows PowerShell は、現在のパイプラインの関数やスクリプトの実行も中止します。C# など、他の言
語では、終了エラーのことを "例外" と呼んでいます。
Trap キーワードは、終了エラーが発生したときに実行する一連のステートメントを指定するものです。Trap ス
テートメントで終了エラーを処理することによって、スクリプトまたは関数の実行を中止せずに、続行させること
ができます。
構文
Trap ステートメントの構文を次に示します。
trap [[<error type>]] {<statement list>}
Trap ステートメントには、終了エラーが発生したときに実行する一連のステートメントを指定します。Trap
キーワードには、必要に応じてエラーの型を指定することもできます。エラーの型は角かっこで囲んで指定する
必要があります。
スクリプトまたはコマンドは、複数の Trap ステートメントを持つことができます。スクリプト内またはコマ
ンド内の任意の場所に Trap ステートメントを記述することができます。
すべての終了エラーのトラップ
どうしても処理することのできない終了エラーがスクリプトまたはコマンドで発生した場合、Windows
PowerShell は、そのエラーを処理できる Trap ステートメントがないか調べます。Trap ステートメント
が存在した場合は、引き続き、Trap ステートメントのスクリプトまたはコマンドを実行します。
非常に単純な Trap ステートメントの例を次に示します。
trap {"Error found."}
この Trap ステートメントは、すべての終了エラーをトラップします。次の例は、この Trap ステートメン
トを含む関数です。
function TrapTest {
trap {"Error found."}
nonsenseString
}
この関数には、エラーの原因となる、意味のない文字列が存在します。この関数を実行すると、
次のような結果になります。
C:\PS> TrapTest
Error found.
次の例には、$_ 自動変数を使用してエラーを表示する Trap ステートメントが含まれています。
function TrapTest {
trap {"Error found: $_"}
nonsenseString
}
このバージョンの関数を実行すると、次のような結果になります。
C:\PS> TrapTest
Error found: 文字列 'nonsenseString' は、コマンドレット、関数、スクリプト ファイル、また
は操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが
含まれている場合はそのパスが正しいことを確認してから、再試行してください。
Trap ステートメントで、より複雑な処理を行うこともできます。Trap ステートメントには、複数の条件や関
数呼び出しを含めることができます。ログの記録や条件判定を行ったり、別のプログラムを実行することもできます。
特定の終了エラーのトラップ
次の例は、CommandNotFoundException エラー型をトラップする Trap ステートメントです。
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
関数またはスクリプトで、既知のいずれのコマンドとも一致しない文字列が検出された場合、この Trap ステ
ートメントによって "Command error trapped" という文字列が表示されます。Windows PowerShell
は、一連の Trap ステートメントを実行した後、エラー ストリームにエラー オブジェクトを書き込んだうえ
で、スクリプトを続行します。
Windows PowerShell では、Microsoft .NET Framework の例外型が使用されています。
System.Exception エラー型を指定する例を次に示します。
trap [System.Exception] {"An error trapped"}
CommandNotFoundException エラー型は、System.Exception 型を継承しています。このステートメン
トは、不明なコマンドであることが原因で発生したエラーをトラップします。さらに、それ以外のエラー型もト
ラップします。
スクリプトには、複数の Trap ステートメントを記述できます。1 つのエラーを複数の Trap ステートメン
トでトラップすることはできません。複数の Trap ステートメントが存在する場合は、発生したエラーを最も具
体的に表すエラー型の Trap ステートメントが Windows PowerShell によって選択され、使用されます。
次のスクリプトの例には、エラーが存在しています。すべての終了エラーをトラップする汎用的な Trap ステ
ートメントに加えて、CommandNotFoundException 型を具体的に指定する Trap ステートメントも記述され
ています。
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {"Command error trapped"}
nonsenseString
このスクリプトを実行すると、次のような結果になります。
Command error trapped
文字列 'nonsenseString' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプロ
グラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合
はそのパスが正しいことを確認してから、再試行してください。
発生場所 C:\PS>testScript1.ps1:3 文字:19
+ nonsenseString <<<<
"nonsenseString" は Windows PowerShell が認識できる項目 (コマンドレットなど) ではないので、
CommandNotFoundException エラーが返されます。この終了エラーは、エラーの型を具体的に定義した
Trap ステートメントによってトラップされることになります。
次のスクリプトは、先ほどの例と同じ Trap ステートメントを含んでいます。ただし、エラーの内容は異なり
ます。
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
1/$null
このスクリプトを実行すると、次のような結果になります。
Other terminating error trapped
0 で除算しようとしました。
発生場所 C:PS> errorX.ps1:3 文字:7
+ 1/ <<<< $null
ゼロ除算では、CommandNotFoundException エラーになりません。このエラーは、もう 1 つの (すべての
終了エラーをトラップする) Trap ステートメントによってトラップされます。
エラーのトラップとスコープ
Trap ステートメントと同じスコープで終了エラーが発生した場合、Trap ステートメントの実行後、そのエラ
ーの次のステートメントから処理が続行されます。Trap ステートメントがエラーとは異なるスコープに存在す
る場合は、その Trap ステートメントと同じスコープ内の次のステートメントから処理が続行されます。
たとえば、関数内でエラーが発生したとき、同じ関数の中に Trap ステートメントが存在する場合は、エラー
発生箇所の次のステートメントから、スクリプトの処理が続行されます。たとえば、次のスクリプトには、エラ
ーと Trap ステートメントが含まれます。
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
Function1 関数を実行すると、スクリプトの後半で、次のような結果が表示されます。
function1
An error:
文字列 'NonsenseString' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプロ
グラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合
はそのパスが正しいことを確認してから、再試行してください。
発生場所 C:\PS>TestScript1.ps1:3 文字:19
+ NonsenseString <<<<
function1 was completed
このエラーは、関数内の Trap ステートメントによってトラップされています。Windows PowerShell は、
メッセージを表示した後、関数の実行を再開します。Function1 が最後まで実行されていることに注目してく
ださい。
これを次の例と比較してみてください。次の例にも、同じエラーと Trap ステートメントが含まれています。
先ほどの例と異なるのは、Trap ステートメントが、関数の外に置かれている点です。
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
. . .
function2
Function2 関数を実行すると、スクリプトの後半で、次のような結果が表示されます。
An error:
文字列 'NonsenseString' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプロ
グラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合
はそのパスが正しいことを確認してから、再試行してください。
発生場所 C:\PS>TestScript2.ps1:4 文字:19
+ NonsenseString <<<<
この例では、"function2 was completed" コマンドは実行されません。どちらの終了エラーも関数の内部
で発生していますが、Trap ステートメントが関数の外に置かれている場合、Windows PowerShell は、Trap ステー
トメントの実行後、再度、関数内に戻ることはありません。
Break キーワードと Continue キーワードの使用
Trap ステートメントで Break キーワードと Continue キーワードを使用することにより、終了エラーの
発生後にスクリプトまたはコマンドの実行を続けるかどうかを制御できます。
一連の Trap ステートメントに Break ステートメントを追加した場合、Windows PowerShell は、関数
またはスクリプトの実行を中止します。Trap ステートメントに Break キーワードを使用した関数の例を次に
示します。
C:\PS> function break_example {
trap {"Error trapped"; break;}
1/$null
"Function completed."
}
C:\PS> break_example
Error trapped
0 で除算しようとしました。
行:4 文字:7
Trap ステートメントに Break キーワードが含まれているので、関数はそこで実行を中止し、"Function
completed" の行は実行されません。
Trap ステートメントに Continue ステートメントを追加した場合、Windows PowerShell は、エラーの
原因となったステートメントの後から実行を再開します。これは、Break も Continue も指定しなかった場合
と同じ動作になります。ただし、Continue キーワードを指定した場合、Windows PowerShell は、エラー
ストリームへの書き込みを行いません。
Trap ステートメントに Continue キーワードを使用した関数の例を次に示します。
C:\PS> function continue_example {
trap {"Error trapped"; continue;}
1/$null
"Function completed."}
C:\PS> continue_example
Error trapped
Function completed.
エラーのトラップ後、関数が再開され、"Function completed" ステートメントが実行されます。エラー
ストリームには何のエラーも書き込まれません。
関連項目
about_Break
about_Continue
about_Throw
about_Try_Catch_Finally
about_Scopes