<try> ステップは、ステップブロックの典型的なエラー処理とクリーンアップロジックを指定するために使用されます。このステップには属性がありません。このステップには次の 3 つの子要素、<block>、<catch>、および <finally> があります。
<try> ステップは次のように実行されます。
<block> 要素内のステップは、すべてが完了するか、ステップのどれかが失敗するまで順に実行されます。各ステップの失敗は、Plan Executor により決定されます。
<catch> 要素が定義されており、かつプランの中断 (abort) またはプランのタイムアウト以外のステップエラーでブロック要素の実行が終了した場合にかぎって、すべてが完了するかあるいはステップのどれかが失敗するまで <catch> 要素内のステップが順に実行されます。
<finally> 要素が定義されている場合、そのステップはそれらがすべてが完了するかステップのどれかが失敗するまで順に実行されます。これは、プランの中断またはプランのタイムアウトのために先の 2 つの要素のどちらか一方が停止しないかぎり、それらの要素の成否に関係なく発生します。
プランの中断またはプラン (ステップではなく) のタイムアウトのために、包含されるステップのどれかが失敗する場合、包含されるほかのステップは実行されず、<try> ステップの実行はエラーを示して終了します。
<catch> 要素は、<block> 要素内で発生するエラーの抑制と、これらのエラーからの回復のために使用されます。<finally> 要素は、典型的なエラーが検出されるかどうかにかかわらず、無条件でクリーンアップを行うために使用されます。
<try> ステップは、以下のように成否が決まります。
<try> ステップに <finally> 要素だけが含まれる場合、<block> または <finally> 要素の実行が失敗すると、このステップは失敗します。
<try> ステップに <catch> 要素だけが含まれる場合、このステップが失敗するのは、<catch> 要素の実行が行われて失敗した、あるいはプランの中断またはプランのタイムアウトのために <block> 要素が失敗した場合のみです。
<try> ステップに <catch> および <finally> 要素の両方が含まれる場合、このステップは以下の状況のいずれかが発生するときだけ失敗します。
<catch> または <finally> 要素が実行されて失敗した場合。
<finally> 要素が実行されて失敗した場合。
プランの中断またはプランのタイムアウトのために <block> 要素が失敗した場合。
以上のことから、<block> 要素の失敗は <catch> 要素の存在で抑制できると言えます。
<try> ステップには次の子要素があります。
<block> – 必須要素で、初めに実行されるステップから構成されています。
<catch> – オプション要素で、典型的なエラー時に実行されるステップが含まれています。<finally> 要素が指定されない場合には、指定する必要があります。この要素を指定する場合、この要素は 1 回しか出現できません。
<finally> – オプション要素で、典型的なエラーであるかどうかにかかわらず実行されるステップが含まれます。<catch> 要素が指定されない場合には、指定する必要があります。この要素を指定する場合、この要素は 1 回しか出現できません。
<block> 要素は、<try> ステップの子要素です。この要素は、<try> ステップによって実行される主要なステップを指定します。<block> 要素には、<try> ステップを含んでいるブロックのスコープ内で許可される 1 つ以上のステップが含まれます。
<catch> 要素は、<try> ステップの子要素です。この要素は、<block> 要素のステップを実行している際に典型的なエラーが発生する場合に実行するステップを指定します。<catch> 要素には、 <try> ステップを含んでいるブロックのスコープ内で許可される任意の数のステップを含めることができます。
<catch> 要素には、<block> 要素の典型的なエラーを抑制するという機能と、典型的なエラー回復作業を定義するという機能があります。この要素は空にすることができます。空にすると、<catch> は典型的なエラーの抑制だけを行います。
<try> ステップの子要素です。<finally> は、<try> または <catch> ステップ内で典型的なエラーが以前に発生したかどうかにかかわらず実行するステップを指定します。典型的なエラーには、プランの中断とプランのタイムアウトがあり、これらのエラーが発生した場合、<finally> 要素のステップはスキップされます。<finally> には、<try> ステップを含んでいるブロックのスコープ内で許可される任意の数のステップを含めることができます。
<finally> 要素は、エラーを考慮することなく常に実行する必要があるクリーンアップステップを指定するために使用されます。エラーに対応してクリーンアップステップを実行するには、代わりに <catch> 要素内にクリーンアップステップを配置します。
以下の例では、コンポーネントのインストールは、再起動があとに続くリソース配備で構成されています。このケースでは、コンポーネントのインストールが完了したと見なされるのは、そのリソースが配備され、再起動時における失敗がそのインストール状態に影響を与えない場合だけです。典型的なエラーは、以下のように再起動時に抑制できます。
<installSteps blockName="default"> <deployResource/> <try> <block> <call blockName="restart"><thisComponent/></call> </block> <catch/><!-- すべての典型的なエラーを抑制します --> </try> </installSteps> |
<try> ブロックは、インテリジェントな自動アップグレードのモデル化に使用できます。バージョン 1.1 のコンポーネントが 2 つの異なるインストールルーチンを持っているとします。あるユーザーはコンポーネントのフレッシュインストールを行い、そのコンポーネントのバージョン 1.0 が以前にインストールされていた場合、もう 1 人のユーザーがアップグレードインストールを行います。この状況は、以下のように単一のインストールブロックとしてモデル化できます。
<installSteps blockName="default"> <try> <block> <checkDependency> <installedComponent name="foo" version="1.0"/> </checkDependency> <!-- 1.0 のインストールが存在するため、アップグレードを行います --> </block> <catch> <!-- 1.0 のインストールが存在しないため、フレッシュインストールを行います --> </catch> </try> </installSteps> |
<finally> ブロックは、通常、一時リソースのクリーンアップに使用されます。次の例では、一時ファイルの作成、処理、および削除が行われます。
<control blockName="default"> <varList> <var name="file" default="/tmp/file.txt"/> </varList> <execNative outputFile=":[file]"> <exec cmd="ls"><arg value="-l"/></exec> </execNative> <try> <block> <!-- 何らかの方法でファイルを処理します --> </block> <finally> <execNative> <exec cmd="rm"><arg value=":[file]"/></exec> </execNative> </finally> </try> </control> |