コラム コラム:タスクが異常終了した場合の原因追跡手法

本記事では、タスクが異常終了した(タスク実行エラーで終了した、または意図した結果と違う結果になった)場合に
原因をある程度追跡する手法について紹介します。

特に、稼働初期のタスクは異常終了がつきものです。
そこから可能な限り失敗する要素を排除したり、回避したりすることで、安定稼働につながります。

■A. 「タスク実行エラー」と「処理結果的にNG」は全く別の事象
まず、以下の概念を明確に区別する必要があります。

概念 内容
1 タスク実行エラー タスクステップがエラーとなり、エラーメッセージと共にタスクが途中で終了する
2 処理結果的にNG 意図したデータとは違うデータが作成される、特定のステップでずっと待ち続ける等、タスク実行エラーで終了しないが意図した結果が得られない

1の場合は、まずは該当のステップとエラーメッセージを確認することで原因の絞り込みが出来ます。
一方で2の場合は、「どのステップから意図した動作とは違う動作になり始めたのか」を明確に把握する為、実際の処理動作を見ながら確認するほかありません。
実際の動作を確認し、何が発生しているかを作成者側で確認しないことには解決することはありません。

■B. 「タスク実行エラー」であっても、エラーになったステップが悪いとは限らない
「タスク実行エラー」となり、エラーメッセージとエラーになったステップが判明していても、当該ステップの設定がおかしいとは限りません。
むしろ、それ以前のステップにおいて意図しない結果となっており、意図しない状態のまま当該ステップに到達することにより副次的にエラーになることの方が多いです。
そのため、エラーになったステップだけを修正したり別のアクションに代替したりしても、解決に至らないことが少なくありません。
【例:以下のような場合が該当】
1. 遷移先の画面が正しくない状態で「Webブラウザ - クリック」が実行され、「指定された条件に一致する要素がありません」とエラーになった
2. 変数の割り算を行うステップで、対象の変数に数字ではない文字列が挿入されてきた結果実行エラーになった
3. キーストローク操作において、操作対象画面のレスポンスが遅く画面制御が追い付かなかった結果、後続の対話機能アクションでボタンが見つからず実行エラーになった
タスク実行エラーになった場合は、「当該ステップを実行できるための条件が全て揃っているか」→「当該ステップの設定に問題はないか」の順に調査を実施するとスムーズです。

■C. 実行エラーになるステップの直前で変数の内容をダイアログに出したり、ファイルに書いたりすると状況が把握しやすい
計算を実施するステップで実行エラーになったり、IFの条件分岐で合致してほしいのに合致しない場合などは、問題になっているステップの直前で保持している変数の内容等をダイアログやファイルに出力するとデバッグがしやすくなります。
【例2: 割り算を実行する際にエラーになってしまう場合】
以下のようなタスクを考えます

<!--この処理はサンプルです。実用的な処理という観点で作成してはいません。-->
<AMVARIABLE NAME="var_num1" VALUE="10" TYPE="number" />
<AMVARIABLE NAME="var_num2" VALUE="2" TYPE="number" />
<!--変数var_num2に現在時刻(分)を乗算する-->
<AMVARIABLE ACTIVITY="set" VARIABLENAME="var_num2">%var_num2 * Minute(Now)%</AMVARIABLE>
<AMSHOWDIALOG>変数「var_num1」÷変数「var_num2」は
「%var_num1 / var_num2%」
です。</AMSHOWDIALOG>

このタスクは、必ずしも成功するとは限りません。
あるタイミングで実行すると、以下のようなエラーメッセージと共に実行エラーになる場合があります。
[無題][Main](Step 6) Divide by zero.
[*x__InternalSub15|x__InternalSub15# 4] Expr__LHS = (var_num1 / var_num2)

内容としては、「ゼロによる割り算が行われた」というものです。
ところが、当該ステップでは0は一切使用していないので、仮に設定を変えても時によってエラーになる事象に変化はありません。
そうすると、次に「当該ステップ実行時に、var_num2は本当に0だったのか」を調べる必要が出てきます。

原因調査のため、以下のようにデバッグ用ステップを追加します。

<!--この処理はサンプルです。実用的な処理という観点で作成してはいません。-->
<AMVARIABLE NAME="var_num1" VALUE="10" TYPE="number" />
<AMVARIABLE NAME="var_num2" VALUE="2" TYPE="number" />
<!--変数var_num2に現在時刻(分)を乗算する-->
<AMVARIABLE ACTIVITY="set" VARIABLENAME="var_num2">%var_num2 * Minute(Now)%</AMVARIABLE>
<AMFILESYSTEM ACTIVITY="write_file" FILE="%GetDesktopDirectory()%\AutoMateデバッグテスト.txt">実行日:%Date()%
var_num2:%var_num2%</AMFILESYSTEM>
<AMSHOWDIALOG>変数「var_num1」÷変数「var_num2」は
「%var_num1 / var_num2%」
です。</AMSHOWDIALOG>

その結果、デバッグ用テキストには
-----------------
実行日:2020/08/12
var_num2:0
-----------------
のように書き込まれ、「var_num2」が本当に0だったことが分かります。

ところが、これだけでは不十分です。初期値「2」で作っているはずの変数「var_num2」が、なぜ0になってしまったのかが分かりません。
そのため、もう1ステップ追加します。

<!--この処理はサンプルです。実用的な処理という観点で作成してはいません。-->
<AMVARIABLE NAME="var_num1" VALUE="10" TYPE="number" />
<AMVARIABLE NAME="var_num2" VALUE="2" TYPE="number" />
<!--変数var_num2に現在時刻(分)を乗算する-->
<AMFILESYSTEM ACTIVITY="write_file" FILE="%GetDesktopDirectory()%\AutoMateデバッグテスト.txt">実行日:%Date()%
現在時刻(分):%Minute(Now)%
var_num2:%var_num2%</AMFILESYSTEM>
<AMVARIABLE ACTIVITY="set" VARIABLENAME="var_num2">%var_num2 * Minute(Now)%</AMVARIABLE>
<AMFILESYSTEM ACTIVITY="write_file" FILE="%GetDesktopDirectory()%\AutoMateデバッグテスト.txt">実行日:%Date()%
var_num2:%var_num2%</AMFILESYSTEM>
<AMSHOWDIALOG>変数「var_num1」÷変数「var_num2」は
「%var_num1 / var_num2%」
です。</AMSHOWDIALOG>

デバッグ用テキストには
-----------------
実行日:2020/08/12
現在時刻(分):0
var_num2:2
実行日:2020/08/12
var_num2:0
-----------------
のように書き込まれます。この情報より、「N時0分」の場合にエラーになってしまうことが明らかになります。
これが判明すれば、0分の場合は何もしない、または別の値を入れることによって実行エラーを回避すればよい、と対策が立てられます。

■D. 画面操作ならスクリーンショットの取得も有効
とあるタスクステップの実行前、または実行エラーで終了してしまった場合の状況把握手法として、「画像 - 画面のキャプチャー」を実施する方法も有効です。
イベントの「OnTaskFailure」にスクリーンショットの取得を仕掛けておけば、タスク実行エラーで終了した際の画面情報を取得可能です。
また、キーストロークの送信前に「アクティブ ウィンドウ」のスクリーンショットを取得すれば、キーストローク実行前にどのウィンドウがアクティブウィンドウになっているかが分かります。

タスクの安定稼働期に入るまでには多数の修正が必要になる場合がほとんどです。
本記事の内容が、タスクの異常終了原因をつぶしていく際の参考になれば幸いです。