Power Appsのエラー処理 IfError関数とIsError関数はTry-Catchのように使えるかも|Power Appsの例外処理検討

僕が知る限り、Power AppsにエラーをCatchする機能はなくて、エラーが発生すると即UIにエラーメッセージが表示されていた。

今回はそんなエラー表示を抑制し、エラーが発生した場合の処理を記述する試験段階の機能、IfError関数とIsError関数の使い方をメモ。

※この記事の内容は「試験段階の機能(Experimental)」です。今後大幅な変更が入る可能性があるので、重要な機能や製品には使用しない方がよいかと思います。
キャンバス アプリで実験的、プレビューおよび廃止された機能を理解する - Power Apps
実験的、プレビュー、および廃止された機能について学びます。

※スクショがすべて「Presence」ではなく「Presense」になっていますが気にしないでください。

スポンサーリンク

使用するサンプルアプリ

今回使用するサンプルアプリはユーザー一覧を表示して、Presence情報(Teamsとかに表示される応答可能の情報)を表示するだけのシンプルなアプリ。
Presence情報を表示する際にGraphAPIを呼ぶのだけれど、無理やりエラーを起こすためにこんな感じで引数にBlank()を入れて呼び出す

すると当然エラーが発生するので、このエラーを検知する処理を色々試してみる。

設定

まずは、IfError関数とIsError関数は試験段階の機能なので、使用する場合は[設定]->[詳細設定]->[数式レベルのエラー管理]をオンにする。
ちなみにこの設定をオンにすると、こんな感じで出ていたエラーの表示が、
こんな感じで表示されなくなる。

エラー表示を出さないようにするだけでよければ、この設定をオンにするだけでも一応非表示にはできる。

IsError関数

まずはIsError関数。このIsError関数はその名の通り、処理を実行したときにエラーが発生するか?を確認してくれる機能。

例えば、こんな感じでエラーメッセージをラベルで用意してあげて、
このラベルのVisibleプロパティに、こんな感じでIsError関数を入れてあげると、エラーが発生したときだけに表示するメッセージを実現できる。
もちろんPresenceの取得処理に正しい引数を入れてあげると、エラーメッセージは表示されなくなる。

こんな感じでIsError関数は、エラーが発生する可能性がある処理を入れてあげると、エラーが発生したときにtrue、エラーが発生しなかったときにfalseを返してくれる

IfError関数

わかりやすいIsError関数に対し、IfError関数は少しわかりにくい。

IfError関数の公式の説明は

IfError 関数は、エラーが見つかるまで値をテストします。 関数がエラーを検出した場合、関数は対応する置換値を評価して返し、それ以降のさらに詳しい評価を停止します。 エラーが見つからない場合は、既定値を指定することもできます。

とある。

また、公式にある構文はこんな感じ。

IfError( Value1, Replacement1 [, Value2, Replacement2, … [, DefaultResult ] ] )

  • Value(s) – 必須。 エラー値をテストする数式。
  • Replacement(s) – 必須。 評価する数式、および一致する値の引数がエラーを返した場合に返される値。
  • DefaultResult – オプション。 数式にエラーが見つからないかどうかを評価する数式。

これがどういうことか少しだけ掘り下げる。

エラーをテストする数式1つ かつ 規定値がない場合

イメージとしては、こんな感じ。

エラーをテストする数式がPresence取得処理で、テストする数式が失敗したときに返す値が「Presenceが取れまへん」文字列。

今回はPresence取得処理でnullを渡していて、確実に失敗するのでPresenceが取れまへんが表示される。

逆にエラーをテストする数式を正しく書くと、こんな感じでPresence情報取得処理で取得した情報が表示される。

エラーをテストする数式が1つ かつ 規定値がある場合

イメージとしてはこんな感じ。

規定値を指定すると、テストする数式が全部成功したときにIfError関数が返す値が規定値になるので、Presence取得処理が成功してもそのPresence情報が表示されずに、規定値(文字列「Presence成功したけど規定値出しまっせ」)が表示される。

エラーをテストする数式が複数 かつ 規定値がない場合

イメージとしては、

IfError(
    処理1,"Presenceが取れまへん",
    処理2,"Presenceが取れまへんで")

がさっきまでのPresenceラベルに入っている感じ。

そうすると、ラベルに表示される値は

  • 処理1が成功かつ処理2が成功→処理2の結果
  • 処理1が失敗→”Presenceが取れまへん”(処理2は実行されない)
  • 処理1が成功かつ処理2が失敗→”Presenceが取れまへんで”

となる。

※全パターンに画像を貼っていくと記事が長くなっちゃうので省略。たぶんこんな書き方しないしw

エラーをテストする数式が複数 かつ 規定値がある場合

イメージとしては、

IfError(
    処理1,"Presenceが取れまへん",
    処理2,"Presenceが取れまへんで",
  "規定値やで"
)

がさっきまでのPresenceラベルに入っている感じ。

そうすると、ラベルに表示される値は

  • 処理1が成功かつ処理2が成功→”規定値やで”
  • 処理1が失敗→”Presenceが取れまへん”(処理2は実行されない)
  • 処理1が成功かつ処理2が失敗→”Presenceが取れまへんで”

となる。

これは複数の式を評価して、全部成功したときにラベルに成功を表示する、みたいなときに使うかもしれない

動作の数式とIfError関数

最後に動作の数式とIfError関数の組み合わせ。

MS公式にある例に、

IfError(
    Patch( DS1, ... ), Notify( "problem in the first action" );  false,
    Patch( DS2, ... ), Notify( "problem in the second action" ); false,
    true
)

というのがあって、これがボタンのOnSelectに入っていた場合の動作を考えてみる。

Patchだとわかりにくいので、

IfError(
    処理1, Notify( "problem in the first action" );  false,
    処理2, Notify( "problem in the second action" ); false,
    true
)

として説明する。

この場合、ボタンを押下したとき

  • 処理1成功かつ処理2成功→trueが返される(つまりUI上は何も起きない)
  • 処理1失敗→Notify( “problem in the first action” )が実行され、falseが返される(UI上は「problem in the first action」という警告が出るだけ
  • 処理2失敗→Notify( “problem in the second action” )が実行され、falseが返される(UI上は「problem in the second action」という警告が出るだけ

わかりにくいのだけれど、処理が失敗したときの動作としてNotifyとfalseのリターンが行われるイメージ。

動作は複数指定可能なので、こんな書き方もできる。

IfError(
    処理1, UpdateContext({str:"problem in the first actions"}); Notify( str ); false,
    処理2, Notify( "problem in the second action" ); false,
    true
)

この場合は処理1が失敗したとき、strという変数にエラーメッセージを残しつつ、Notifyに警告を出すことができる。

まとめ

最後は少し駆け足になっちゃったけど、IfError関数とIsError関数はこれまでIsBlankOrError関数しかなかったPower Appsに、柔軟なエラー処理を実装することができるようになる。

ぜひ早めに公開してほしいな、と思いましたとさ。

コメント

タイトルとURLをコピーしました