試してください/キャッチ/最後に

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ブロックによってキャッチされるため、引数の例外はスキップされます。 これは次の図で見ることができます:







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



All Articles