- 04/01/2019
- 6分読む
-
- S
- s
- c
簡単な説明
Try
、Catch
、およびFinally
ブロックを使用してエラーを処理する方法について説明します。,
長い説明
Try
、Catch
、および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 Finally
keywords 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でトラップを使用する
Try
Trap
Try
ブロック内に定義されたCatch
ブロック内にCatch
ブロックがあっても、Try
ブロック内に終了エラーが発生した場合、Trap
ステートメントはコントロールを取ります。,
Trap
がTry
よりも高いブロックに存在し、現在のスコープ内に一致する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
コメントを残す