(BizRobo)簡易で漏れのないエラーハンドリング方法の一例

<h2 name="Cf72P">はじめに</h2><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="1SvwN">※こちらの記事は以前noteで投稿していた記事の移植版です。

今回はBizRobo!でのエラーハンドリング方法の一例です。<br>
あくまで一例ですし、何が最適解なのかはケースバイケースだと思っていますので、こういう方法や考え方もあるんだなーぐらいの気持ちで見ていただければと思います。<br>
ただし、記事自体は長いので少し覚悟してください。<br>
<br>
BizRobo!でのエラーハンドリングの組み方については、私がBizRobo!に携わることになった2017年からずっと考えてきて、実装の間違いが起きにくく、初心者でも比較的作りやすく、分かりやすく、それでいて網羅性があり、運用が楽になる作り方がないか模索してきました。<br>
<br>
もちろん要件によって何が最適かは変わりますし、できるできないもあります。<br>
しかしある程度のところまでカバーできて運用保守の観点でも悪くなさそうな方法がようやく見えてきた気がするので記事にします。</p><h2 name="lP4MS">よくあるエラーハンドリング方法</h2><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="VEDp6">まず、よくある方法として考えられるのは、エラー発生時はトライステップ分岐からエラー処理用のフローに進ませるため、各ステップのエラーハンドリングでトライステップに進ませるように設定するものがあると思います。<br>
↓こういうやつですね↓</p><p name="mu5zQ"><img alt="よくあるエラー処理" src="https://i.gyazo.com/f5a3738f730c8d5a12d8eb820f10ad8f.png" width="193" height="124" class=""></p><h2 name="MChyu">BizRobo!でのエラーハンドリングの課題</h2><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="lrZz0">しかし、ここでBizRobo!の仕様上課題がありました。<br>
<br>
・「次のトライステップに進む」に設定するとデフォルトで「エラーとしてログ記録」のチェックが外れてエラー時にログが記録されなくなるため、ログ記録させたいときはひとつひとつチェックをつけ直さなくてはならない<br>
・複数ステップまとめての設定ができない<br>
・各ステップからどこのトライステップに進むかはステップの設定を確認しなくては分からない<br>
<br>
下図のようなフローもあり得るわけです。</p><p name="oFOvr"><img alt="エラー処理例" src="https://i.gyazo.com/a26d62eaf049d93db540071413d8d80e.png" width="620" height="221"></p><p name="SjdCe" id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE">何がどうなるのかパッと見では分かりにくいですし、<br>
私はロボットの改修やエラー発生時の調査時等にあちこちにある分岐をいちいち確認するのは手間だと感じます。<br>
ましてや、いちいちエラーハンドリングタブを見て内容確認するなどなるべくしたくありません。<br>
※そのために直近のトライステップにしか進ませないよう開発ルールとして定めているユーザーさんもいらっしゃると聞いたことがあります</p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="iaO9I">また、開発時にエラー記録のつけ忘れや諸々の設定漏れが出る可能性もあります。<br>
これらの課題を改善するため、次章で解説する作り方を考えました。</p><h2 name="w8tei">いっそエラーハンドリングを設定しない</h2><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="vR9Nm">まず今回の肝は、本来ロボットにやらせたいメインの処理を行うフロー内では、細かくエラーハンドリングを設定するのをやめて全てデフォルトの「後続のステップすべてをスキップ」にしてしまうことです。<br>
したがってエラーが起きてもトライステップには進ませません。<br>
厳密には、最終的にはトライステップでの分岐を利用しますが、なるべく設定箇所は少なくします。<br>
<br>
そもそも個別のステップに設定させなければ設定漏れや設定間違いなどしようがないという逆転の発想です。<br>
miniをお使いの方や、Kapplet等でAPI実行を利用する場合、エラー時にAPI例外でロボットが止まってしまうので、API例外のチェックだけは外してくださいね。</p><p name="jAPZx"><img alt="API例外" src="https://i.gyazo.com/1346909dd806520d293434bc03c8fac7.png" width="345" height="103"></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="eRJOq">◆参考ナレッジ<br>
ロボットの実行方法によるAPI例外発生時の挙動の違い<br>
<a href="https://knowledge.bizrobo.com/hc/ja/articles/360036376152" target="_blank" rel="nofollow noopener">https://knowledge.bizrobo.com/hc/ja/articles/360036376152</a><br>
<br>
まず、エラーハンドリングをスキップのままにする、ということは実線の分岐(ブランチ)がある場合には、エラーが発生してもロボットは停止せずそのまま次の処理に移ってしまうということになります。</p><p name="Dvg63"><img alt="ブランチの場合" src="https://i.gyazo.com/234be6830e68c2603df8fe243cff8c62.png" width="196" height="169"></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="Ep3lT">前段の処理がエラーなく完了していることが前提になっている場合、そのまま処理してしまうとさらなる問題が発生する場合もあるため、本来は後続の処理をさせないようにしないといけない場合が多くあります。<br>
<br>
そういう場合のためにトライステップに進ませて停止させることも多いのですが、先ほどのようにいちいち全ステップ設定するのは、長い長いフローを作っているとなかなかの苦行です。<br>
かといってエラーが多く発生すると想定される数ステップだけの設定では、それ以外のステップで想定外の事象が発生した際、ハンドリングできずに不測の事態が発生しかねません。</p><h2 name="5OJFk">具体的な設定方法</h2><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="ykvXI">上記の問題を防ぐためにどうするかというと、エラーが発生しているかどうかを判定するためのフラグ用のグローバル変数を用意し、<br>
フローの最初でフラグ変数をオンにし、エンドステップの手前でフラグ変数を解除します。<br>
<br>
図にするとこんな感じです。</p><p name="TSI8p"><img alt="処理フラグ" src="https://i.gyazo.com/6649ea6087b8bba09bbe463bee1625f8.png" width="504" height="115"></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="OWVNs">次のブランチに移ったときにフラグ変数の値を確認し、フラグがオンの場合には後続処理に進ませないようにします。<br>
<br>
そして、最後の後処理用のブランチでも判定させ、エラーが発生していたらエラーメールの送信やログ記録等エラー時の処理をし、<br>
エラーが発生していなかったら正常終了として完了メール送信、といった感じにします。<br>
<br>
これだけでもひとまずエラーが発生したかどうかの処理は分けられるのですが、じゃあどこでエラーが出たの？どう対応すればいいの？というのもメールで送ったりログに残せたら便利だと思いませんか？<br>
<br>
もちろんManagement&nbsp;Consoleではエラー発生ステップのログ等は残ります。<br>
しかし、例えば業務担当者にメールで次のアクションを教えたいとかってこともあると思います。<br>
<br>
そのために必要なことは以下の通りです。</p><p name="YFzuq">・Excelファイル上に、処理内容やその処理のエラー時にどう対応するか等をあらかじめ一覧化し、付番する<br>
・ロボット上で大まかな処理のまとまりに入る際、Excel上で付番した通りの番号を記録する<br>
・エラー処理時にExcelを参照し、エラー発生時点の番号に従ってエラー内容を抽出する<br>
<br>
こうすれば、単純にロボットの処理が簡単になるだけでなく、Excelを見ればロボットを細かく見ることなく、想定されているエラーの内容がわかりますし、文言を変更したいときもExcelに書いてある文言を変えればOKになり、保守が楽になります。<br>
<br>
設定例を見てみましょう。<br>
<br>
<b>■Excel</b><br>
各番号と処理内容、対応内容等を記載しておきます。</p><p name="fh7FJ"><img alt="画像6" src="https://i.gyazo.com/dabd9ddc05b5fa01f1dd93b0f6b5fae8.png" width="620" height="372"></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="oXR0f"><b>■DSのフロー<br>
</b>大まかに見るとこんな感じです。</p><p name="2S3jY"><img alt="エラーハンドリングフロー例" src="https://i.gyazo.com/a75b0154bacf0ac74857b44851064a22.png" width="620" height="284"></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="286gv"><b>■付番</b><br>
変数の割当で各ステップに番号を記載していきます。</p><p name="DPA47"><img alt="エラーNo割当" src="https://i.gyazo.com/a1878a18f1afd2d900c5d0014a2d66c8.png" width="339" height="233" class=""></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="FjLTv"><b>■付番通りにエラー内容を参照</b><br>
付番通りに参照するには「名前付き範囲設定」を利用して番号を記録した変数をセルパターンに指定して検索します。</p><p name="Ljp4Q"><img alt="セルパターン" src="https://i.gyazo.com/c01534b973d5f975de60caf6cdeb42e1.png" width="346" height="534" class=""></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="5QXeQ">以下ナレッジもご参考ください。<br>
「名前付き範囲設定(Set Named Range)」ステップ<br>
<a href="https://knowledge.bizrobo.com/hc/ja/articles/360049840052" target="_blank" rel="nofollow noopener">https://knowledge.bizrobo.com/hc/ja/articles/360049840052</a><br>
<br>
名前付き範囲が設定できたら、その範囲を頼りにセル位置を指定して値抽出します。</p><p name="YDhES"><img alt="画像10" src="https://i.gyazo.com/63a189db58194d9db386f4b664945ec5.png" width="620" height="409"></p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="MLTCM">流れとしては概ねこのような感じです。<br>
ログ記録やトライステップに進ませるための設定が漏れるというのも、そもそもはじめから設定などしなければ設定漏れは発生しませんし、想定外の箇所でエラーが出てエラーメールを送信できないとか、次の処理に進ませたくないのに進んでしまうということもありません。</p><h2 name="VIHbG">まとめ</h2><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="1riqn">長々と書いてしまいましたが、いかがでしたでしょうか。<br>
こちらの記事が皆様のロボット作成に少しでも参考になれば幸いです。</p><p id="36312F7A-AB56-4D58-8399-A0D3B2BC38FE" name="G0tpZ">なお、今回は細かく触れませんが、複数ファイルやExcelで複数行を繰り返し処理させ、エラーになっても続行して後続ファイルやほかの行を処理したいから処理を止めたくないということもあると思います。<br>
この場合でも少し工夫すれば上記の方法を利用できます。<br>
詳しいことは別の機会に書ければと思いますが、エラーが発生したファイルや何行目かを記録しておくことは容易に可能です。<br>
<br>
まだまだ模索中ですので、もし、こんな方法もあるよ！もっとこうしたらどう？みたいなことがあればコメントいただけますとありがたいです。</p>