Try / Catch / finallyを使用すると、実行されるコマンドは
Tryブロックに配置されます。 コマンドの実行中にエラーが発生した場合、エラーは
$ Error変数に書き込まれ、スクリプトは
Catchブロックに移動します。
TestTryCatchFinally.ps1スクリプトは、オブジェクトを作成しようとして
Tryコマンドを使用します。 作成オブジェクトは変数
$ ob1にあります。
New-Objectコマンドレットは
オブジェクトを作成します。 オブジェクトを作成して
$ a変数に配置すると、
Get-Memberコマンドレットを使用してオブジェクトのメンバーを確認できます。 次のコードはこれを示しています。
Try { "Attempting to create new object $ob1" $a = new-object $ob1 "Members of the $ob1" "New object $ob1 created" $a | Get-Member }
catchブロックを使用して、tryブロックで発生したエラーをキャッチします。 キャプチャするエラーのタイプと、エラーが発生した場合に発生するアクションを指定できます。
TestTryCatchFinally.ps1スクリプトでは
、 System.Exceptionなどのエラーを
追跡し ます 。
System.Exeption .Net Frameworkクラスは、他のすべての例外が依存する基本クラスです。 これは、
System.Exeptionが汎用の汎用クラスであることを意味し、本質的には、事前定義されたすべての例外(一般およびシステムの両方)を取得できます。 エラーをキャッチするときに、実行するコードを指定できます。 この例では、スクリプトがシステム例外をキャッチしたことを示す簡単な行を出力します。
catchブロックは次のとおりです。
Catch { [system.exception] "caught a system exception" }
Try / Catch / finallyシーケンスの
finallyブロックは、エラーが発生したかどうかに関係なく、常に実行されます。 これは、たとえばCOMオブジェクトを明示的に解放するなど、完了したいいくつかのことを、
Finallyブロックに配置する必要があることを意味します。
TestTryCatchFinally.ps1スクリプト
では、
Finallyブロックはスクリプトが完了したステータスバーを示しています。 これを以下に示します。
Finally { "end of script" }
TestTryCatchFinally.ps1スクリプト
全体 :
TestTryCatchFinally.ps1 $ob1 = "kenobie" "Begin test" Try { "Attempting to create new object $ob1" $a = new-object $ob1 "Members of the $ob1" "New object $ob1 created" $a | Get-Member } Catch [system.exception] { "caught a system exception" } Finally { "end of script" }
TestTryCatchFinally.ps1スクリプトの実行中に、変数
$ ob1が「kenobie」に
設定されている場合、
New-Objectコマンドレットを使用して作成できる「kenobie」という名前の単一オブジェクトがないため、エラーが発生します。 次の図は、スクリプト出力を示しています。

前の図からわかるように、
Try / Catch / finallyループの範囲外にあるため、「Begin Test」行が表示されます。
Tryブロックの内部には、
New-Objectコマンドの前に実行されるため、文字列「Attempting to create new object kenobie」が表示されます。 これは、
Tryブロックが常に内部でコードを実行しようとすることを示しています。 文字列「new object kenobie created」が表示されないように、kenobieオブジェクトのメンバーは出力されません。 これは、エラーが発生した後、スクリプトが次のブロックに続くことを示します。
Catchブロックでは、タイプ
System.Exeptionのエラー
がキャプチャされ、文字列「caught a system exception」が表示されます。 次に、スクリプトは、
Finallyブロックに移動し、「スクリプトの終わり」という文字列を表示します。
スクリプトで変数
$ ob1が「system.object」(正しい値)に設定されている場合、
Tryブロックは完全に成功します。 これを次の図に示します。オブジェクトのメンバーが表示され、オブジェクトが正常に作成されたことを示す線も表示されます。
Catchブロックは
起動せず、
Finallyブロックの文字列「end of script」が表示されます。
Try / Catch / finallyブロックで複数の
Catchブロックを使用できます。 例外が発生すると、Windows Powershellは
Tryブロックを離れ、
Catchブロックを探すことに注意して
ください 。 例外条件を満たす最初の
Catchブロックが使用されます。 したがって、最も具体的な例外を最初に使用し、より一般的な例外に移る必要があります。
これは
TestTryMultipleCatchFinally.ps1に表示され
ます 。
TestTryMultipleCatchFinally.ps1 $ob1 = "foo" "Begin test" $ErrorActionPreference = "stop" Try { Get-Content foo "Attempting to create new object $ob1" $a = new-object $ob1 "Members of the $ob1" "New object $ob1 created" $a | Get-Member } Catch [System.Management.Automation.PSArgumentException] { "invalid object" } Catch [system.exception] { "caught a system exception" } Finally { "end of script" }
次の図は、
TestTryMultipleCatchFinally.ps1スクリプトの出力を示しています。 2つの変更が行われました:
$ ErrorActionPreferenceおよび
Get-Content fooコマンドが
コメント化されました 。 したがって、存在しないオブジェクトを作成しようとすると、生成されたエラーが発生します。 特定のエラーを見つけるために、
TestTryMultipleCatchFinally.ps1スクリプトを実行した後、
$エラー変数を調べました。 エラーは[
例外]フィールドに示されます。
PS C:\> $error | fl * -F PSMessageDetails : Exception : System.Management.Automation.PSArgumentException: Cannot find type [foo]: verify that the assembly containing this type is loaded. at System.Management.Automation.MshCommandRuntime.ThrowTerminat ingError(ErrorRecord errorRecord) TargetObject : CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand ErrorDetails : InvocationInfo : System.Management.Automation.InvocationInfo ScriptStackTrace : at <ScriptBlock>, C:\Users\dyak\SkyDrive\Scripts\habrahabr\TestTry MultipleCatchFinally.ps1: line 10 PipelineIterationInfo : {}

スクリプトにいくつかのエラーがあり、
$ ErroActionPreference変数の値が「stop」に設定されている場合、最初のエラーによりスクリプトがクラッシュします。
$ ErrorActionPreferenceおよび
Get-Contentコマンドからコメントを削除すると、最初のエラーは
System.Exception Catchブロックによって
キャッチされるため、引数の例外はスキップされます。 これは次の図で見ることができます:

一般に、彼はエド・ウィルソンによってブロックで出版された
記事を翻訳しようとしました。 それが誰かに役立つことを願っています。