
記事記号:[me1588] 初版:2011/May/10

トピック
about_Trap
簡易説明
終了エラーを処理するキーワードについて説明します。
詳細説明
終了エラーが発生すると、ステートメントの実行が中止されます。終了エラーに対し
て何も処理を行わなかった場合、Windows PowerShell は、現在のパイプラインの関
数やスクリプトの実行も中止します。C# など、他の言語では、終了エラーのことを
"例外" と呼んでいます。
Trap キーワードは、終了エラーが発生したときに実行する一連のステートメントを
指定するものです。Trap ステートメントで終了エラーを処理することによって、ス
クリプトまたは関数の実行を中止せずに、続行させることができます。
構文
Trap ステートメントの構文を次に示します。
trap [[]] {}
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 ステートメントによってトラップされています。Wi
ndows PowerShell は、メッセージを表示した後、関数の実行を再開します。Funct
ion1 が最後まで実行されていることに注目してください。
これを次の例と比較してみてください。次の例にも、同じエラーと 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 P
owerShell は、関数またはスクリプトの実行を中止します。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 Power
Shell は、エラーの原因となったステートメントの後から実行を再開します。これ
は、Break も Continue も指定しなかった場合と同じ動作になります。ただし、Co
ntinue キーワードを指定した場合、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

基本ソフト: Windows 7
キーワード: Windows PowerShell、ヘルプ、HelpFile、about_trap