こさい
こさい

こんにちは。完全自動化研究所の小佐井です。
この記事ではPower Automate for desktopのエラー処理の方法について解説します。

エラー処理の大切さは前回学んだわ

めーたん
めーたん

Power Automate for desktopのエラー処理について考える第2回目の記事です。

前回の記事ではエラー処理の必要性について学びました。

この記事では具体的なエラー処理の方法について学びます。

具体的なエラー処理は大きく分けて2つあります。

本レクチャーはその1つ目「まとまったフローのエラー処理を行おう」です(図1)。

【図1】記事の構成

基本的には複数のアクションをまとめてエラー処理を行いましょう。指定した範囲内で発生したエラーを認識して処理を行うことをプログラマーの言葉では、「エラーをキャッチ(Catch)する」といいます。

図2を使って解説します。

図2の赤いコの字型で囲ったブロック内のどこでエラーが発生してもエラーがキャッチされます(図2①)。エラーがキャッチされたら、エラー処理が呼び出され(図2②)、エラー時のアクションが実行されます(図2③)。

ここから2つのパターンに分岐します。

1つはエラーをもう一度スローして(投げて)、異常終了するパターンです(図2④)。もう1つはフロー実行を続行するパターンです(図2⑤)。

フロー実行を続行した場合、[アクション4]が実行され、正常終了します(図2⑥)。ただし、[アクション4]でエラーが発生しても、エラー処理は行われません。

【図2】エラーをキャッチする

一度に理解するのは、少し難しいかもしれませんね。

本記事では、図2を体感するために実際にフローを作って実行します。

それでは、どうぞ!

まとまったフローのエラー処理を行おう

本記事で作成するフローの概要

本記事で作成するフローを簡単に把握しましょう(図3)。

テキストファイルを読み込んで、演算を行い、最後にメッセージボックスを表示するというフロー(図3①)は前記事で作成しました。

このフロー内でエラーが発生した場合は、エラーキャッチして、エラーメッセージを表示します(図3②)。

【図3】本記事で作成するフローの概要

作成準備

こさい
こさい

フローを作成する前に準備を行ってください

STEP1 フロー[エラー処理]をコピーする

前記事「エラー処理について考える」で作成したフロー[エラー処理]をコピーして、フロー[ブロックエラー処理]を作成してください(図4)。

【図4】フロー[エラー処理]をコピーする

STEP2 フロー[ブロックエラー処理]をフローデザイナーで開く

STEP1で作成したフロー[ブロックエラー処理]をフローデザイナーで開いてください。

フロー[エラー処理]で作成したフローが表示されている状態になります(図5)。

【図5】フロー[ブロックエラー処理]をフローデザイナーで開く

これで準備は完了です。

作成方法

1 エラー処理を行うサブフローの作成

STEP1 サブフロー[Catch]を追加する

コンソールの[新しいサブフロー]をクリックすると、[サブフローの追加]ダイアログが表示されるので、[サブフロー名]に「Catch」と入力して(図6❶)、[保存]をクリックしてください(図6❷)。

サブフロー[Catch]が追加されます。

【図6】サブフロー[Catch]の追加

STEP2 [コメント]アクションを追加する

アクションペインの[フローコントロール]グループをクリックし(図7❶)、[コメント]アクションをサブフロー[Catch]のワークスペースに追加してください(図7❷)。

【図7】[コメント]アクションの追加

[コメント]ダイアログが開くので、図8❸のようにコメントを入力し、[保存]をクリックしてください(図8❹)。

【図8】[コメント]アクションの設定

STEP3 [最後のエラーを取得]アクションを追加する

アクションペインの[フローコントロール]グループ内の[最後のエラーを取得]アクションを[コメント]アクションの後に追加してください(図9❶)。

【図9】[最後のエラーを取得]アクションの追加

[最後のエラーを取得]ダイアログが開くので、[生成された変数]に[LastError]が表示されていることを確認し(図10❷)、[エラーを消去する]はデフォルトのまま[無効]とします(図10❸)。

[保存]をクリックしてください(図10❹)。

【図10】[最後のエラーを取得]アクションの設定

STEP4 [メッセージを表示]アクションを追加する

アクションペインの[メッセージボックス]グループをクリックし(図11❶)、[メッセージを表示]アクションを[コメント]アクションの後に追加してください(図11❷)。

【図11】[メッセージを表示]アクションの追加

[メッセージを表示]ダイアログが開くので、[メッセージボックスのタイトル]に「%LastError.SubflowName%内でエラー発生」と入力し(図12❸)、[表示するメッセージ]に図12❹のように入力してください。

【図12】[メッセージを表示]アクションの設定-1

[メッセージボックスアイコン]のドロップダウンリストから[エラー]を選択してください(図13❺)。

【図13】[メッセージを表示]アクションの設定-2

[メッセージボックスを常に手前に表示する]を[有効]にし(図14❻)、[メッセージボックスを自動的に閉じる]はデフォルトのまま[無効]としてください(図14❼)。

[生成された変数]の[ButtonPressed]を[無効]にして(図14❽)、[保存]をクリックしてください(図14❾)。

【図14】[メッセージを表示]アクションの設定-3

【HINT】「LastError.SubflowName」を正確に入力する方法

[メッセージボックスのタイトル]の「LastError.SubflowName」は、次のステップで選択すると正確に入力できます。

[メッセージボックスのタイトル]の[変数の選択]アイコンをクリックすると(図15❶)、フロー変数の一覧が表示されるので、[LastError]の右側の[>]アイコンをクリックしてください(図15❷)。

【図15】[LastError.SubflowName]を選択する方法-1

[LastError]のプロパティが表示されるので、[.SubflowName]をクリックし(図16❸)、[選択]をクリックしてください(図16❹)。

【図16】[LastError.SubflowName]を選択する方法-2

サブフロー[Catch]が完成しました(図17)。

【図17】サブフロー[Catch]の完成

2 メインフローの作成

Mainタブをクリックして、メインフローを表示してください

STEP1 [ブロックエラー発生時]アクションを追加する

メインフローを開いてください(図18)。

【図18】メインフローを開く

アクションペインの[フローコントロール]グループをクリックし(図19❷)、[ブロックエラー発生時]アクションを[コメント]アクションの後に追加してください(図19❸)。

【図19】[ブロックエラー発生時]アクションの追加

[ブロックエラー発生時]ダイアログが開くので、[名前]に「Main_Block」と入力してください(図20❹)。[新しいルール]をクリックしてください(図20❺)。

メニューが表示されるので、[サブフローの実行]をクリックしてください(図20❻)。

【図20】[ブロックエラー発生時]アクションの設定-1

[サブフローの実行]のドロップダウンリストから[Catch]を選択してください(図21❼)。

【図21】[ブロックエラー発生時]アクションの設定-2

[スローエラー]はそのまま選択状態として(図22❽)、[予期しないロジックエラーを取得]もデフォルトのまま[無効]としてください(図22❾)。

[保存]をクリックしてください(図22❿)。

【図22】[ブロックエラー発生時]アクションの設定-3

STEP2 4ステップ目から6ステップ目までを移動する

4ステップ目から6ステップ目までを選択して(図23❶)、[ブロックエラー発生時]アクションと[End]アクションの間にドラッグ&ドロップで移動させてください(図23❷)。

【図23】4ステップ目から6ステップ目までを移動

メインフローが完成しました(図24)。

【図24】メインフローの完成

実行する

1 エラー後、フローを続けない場合(スローエラー)

フローを実行してください(図25❶)。「エラー処理について考えよう」で[エラーテスト.txt]の名前を[エラーテスト2.txt]に変更したままなのでエラーが発生し(図25①)、[Catch]サブフローに遷移し(図25②)、メッセージボックスが表示されます(図25③)。

タイトルからメインフロー内でエラーが発生したことがわかります(図25④)。エラーが発生したアクション(図25⑤)とそのエラー内容もわかります(図25⑥)。

[OK]をクリックしてください(図25❷)。スローエラーによりフローが異常終了します。

【図25】フロー実行結果

めーたん
めーたん

このエラーは「エラー処理の必要性を理解しよう」の記事でもみたエラーだね

「エラー処理の必要性を理解しよう」と同様にエラーパネルにエラーが表示されます。

エラーを確認できたので、[ドキュメントフォルダー]の[エラーテスト2.txt]の名前を[エラーテスト.txt]に変更してください(図26❶❷)。

【図26】[エラーテスト2.txt]の名前を[エラーテスト.txt]に変更

2 フローを続けない場合(スローエラー)その2

別のエラーを発生させてみましょう。[エラーテキスト.txt]の内容を変更してください。現在「1」が入力されていますが、これを「0」に変更し、上書き保存して閉じてください(図27❶❷❸)。

【図27】[エラーテキスト.txt]の内容を変更

フローを実行してください。[変数の設定]アクションでエラーが発生します(図28❶)。エラー内容は「0で割る演算は許可されません」となっています(図28①②)。

変数[FileContents]には「0」が入るので、100を0(ゼロ)で割ることになり、ゼロ除算エラーが発生することになります。

【図28】フローの実行結果

めーたん
めーたん

ブロックエラーが効いていない感じ!?

今度はサブフロー[Catch]に遷移せずに終了しました。なぜでしょう?

Power Automate for desktopがあらかじめ予期しているエラーには対応できますが、予期しないエラーは[ブロックエラー発生時]アクションのデフォルトの設定では対応できません

この例のように、演算を行ってみないとわからないゼロ除算エラーのような論理的なエラーは予期できず対応できなかったというわけです。

3 フローを続けない場合(スローエラー)その3

このような予期しないエラーにも対応できるように、[ブロックエラー発生時]アクションを変更してください。

[ブロックエラー発生時]アクションをダブルクリックしてください(図29❶)。

【図29】[ブロックエラー発生時]アクションをダブルクリック

[ブロックエラー発生時]ダイアログが開くので、[予期しないエラーを取得]を有効にし(図30❷)、[保存]をクリックしてください(図30❸)。

【図30】[ブロックエラー発生時]アクションを変更

もう一度、フローを実行してください。今度はサブフロー[Catch]に遷移し、エラーメッセージボックスが表示されます(図31)。

論理的なエラーをキャッチすることができました。

【図31】フローの実行結果

めーたん
めーたん

論理的エラーにも対応できた!

4 フローを続ける場合(フロー実行を続行する)

最後にエラーが発生しても、フローを続ける場合を試してみましょう。

[ブロックエラー発生時]アクションを変更してください。

[ブロックエラー発生時]アクションをダブルクリックしてください(図32❶)。

【図32】[ブロックエラー発生時]アクションをダブルクリック

[ブロックエラー発生時]ダイアログが開くので、[フロー実行を続行する]をクリックしてください(図33❶)。

[例外処理モード]はデフォルトのまま[ブロックの末尾に移動する]とし(図33❷)、[保存]をクリックしてください(図33❸)。

【図33】[ブロックエラー発生時]アクションを変更

【HINT】[例外処理モード]の選択項目

[例外処理モード]の選択項目は下図の5つがあります(図34)。

【図34】[例外処理モード]の選択項目

フローを実行してください(図35❶)。[Catch]サブフローに遷移し、[エラー発生]メッセージボックスが表示されます。

[OK]をクリックしてください(図35❷)。

【図35】フローの実行結果

さらにフローの実行が続き、「フローの実行に成功しました」というメッセージボックスが表示されるので、[OK]をクリックしてください(図36❸)。

フローが終了します。

ステータスバーに「ステータス:準備完了」と表示されます。

エラーメッセージが表示されたのに、「フローの実行に成功した」というのには違和感があるかもしれませんが、これは正しい動作です。

エラーが発生したけれど、フローを続行することができたということです。

【図36】フローの実行結果

まとめ

ブロック内には複数のアクションがあり、複数の種類のエラーが発生する可能性があるので、エラー処理は汎用的なものになります。

エラーメッセージを取得して、メッセージボックスでポップアップ表示するくらいがよいでしょう。

ブロック内でエラーが発生して、フローを続行するケースは多くないはずです。

ブロック内には複数のアクションがあり、複数の種類のエラーが発生する可能性があるからです。

どのエラーが発生するのかわからないのに、構わずフローを続行するということはないでしょう。事実、「4 フローを続ける場合(フロー実行を続行する)」の実行結果はエラーが発生したのに、フローが成功したことになってしまいました。

エラーが発生しても強制的に無視していいと分かっている場合のみこのフローは有効です。

特殊なケースとして、たまにブロック内でエラーが発生することが分かっており、複数回ブロック内のアクションを繰り返し実行したい場合があります。

めーたん
めーたん

いろいろなパターンのエラーがあって、それぞれのエラー処理が用意されているのね

エラーについて詳しくなってきたね!
次の記事では個別エラーについて解説するよ

こさい
こさい

関連する記事

Power Automate for desktopの書籍を出版しています。


さらにPower Automate for desktopに詳しくなるには

まとめてPower Automate for desktopの知識を身に付けたい方は、ぜひ書籍をお読みください。

人気記事ランキング(Power Automate for desktop)

1 2 3 4 5 6 7 8 9 10