第70回 エラー処理をする

おはようございます。こんにちは。こんばんは。
エヌ・ケイ・カスタマイズの泉です。

福岡は、日中のひなたは日差しが暑いですが、日陰は涼しく過ごしやすい日が続いています。
福岡のコロナ感染者数は、だいぶ少なくなってきて、ホッとしています。次の波が来ないことを、切に祈っております。

前回までで、いろいろなスクリプトが書ける(実装できる)ようになったと思います。
ですが、どのようなスクリプトを実装するにしても、欠かせない処理があります。
それが、エラー処理です。

エラー処理をする

スクリプトを作成する際、まずは、『思ったような』結果になるように「成功パターン」のスクリプトステップを書くと思います。
そのスクリプトは「成功パターン」のみで終わってよいでしょうか?
『思ったような』引数がもらえなかった時、『思ったような』レコードがなかった時、どんな結果になるでしょうか?
「成功パターン」だけでなく、「失敗パターン」も『思ったような』結果になるようにコントロールする必要があります。

以降、例をあげて解説します。

エラー処理をしなかった場合

わざとエラーになるようなスクリプトを準備します。

レイアウト切り替え[タスク一覧(タスク管理)]

(1 行あける)
検索モードに切り替え[一時停止:オフ]
フィールド設定[タスク管理 :: ステータス;"延期"]
レコード/検索条件確定[ダイアログあり:オフ]
検索実行[ ]

(レコードの状態)
・レコードは複数存在する
・ステータス=遅延 のレコードは存在しない

この状態で、上記スクリプトを実行します。
すると、下図のエラーメッセージが表示されます。

これは、「標準のエラーメッセージ」と呼ばれ、FileMaker Pro の標準機能によるものです。

どうでしょうか?どのボタンをクリックするべきか迷いませんか?
実際にクリックすると[キャンセル]と[続行]は同じ動作に見えます。
しかし、違いがあります。
・[ キャンセル] → スクリプトをキャンセル(中断)
・[ 続行] → スクリプトを続行
・[ 検索条件を変更] → 違う条件を入力できるよう検索モードでスクリプトを一時停止
[検索実行]スクリプトステップが最後のスクリプト行なので、中断しても続行しても同じ動作に見えたのです。

検索結果が0件(エラー)の場合にどうするか

検索は、検索条件に合致するデータが必ず存在しているとは限りません。
そのときに、上図のような「標準のエラーメッセージ」を表示したままでよいでしょうか。
例のスクリプトでは、最後の行まで実行された後に表示される「標準のエラーメッセージ」なので、
どのボタンをクリックしても問題がおきません。
しかし別のスクリプトでは途中で表示されると、ユーザが困ることが起きるかもしれません。
または、スクリプトを途中でキャンセルされて想定した動作ではなくなることもあります。
「標準のエラーメッセージ」の文言やボタン名を変更することはできません。
スクリプトステップでコントロールできる内容ではありません。
ですから、代わりにカスタムダイアログと選択肢をスクリプトで表示する方が安全です。

エラーがあることを想定して対応をおこなう

これが「エラー処理」と呼ばれるものです。

エラー処理をした場合

例のスクリプトに立ち戻ってもう少し考えます。
検索結果が 0件 であることは、FileMaker Pro にとってはエラーです。
しかし、このスクリプトの結果は、
・検索に合致するタスクがある → 次の行動を起こす
・検索に合致するタスクがない → 何もしない
という目的で利用されます。
したがって、合致するものがなければ無理になにかを探さなくても問題ありません。
・検索に合致するタスクがない → 「ありません」と結果を返す
という動作で良いと考えられます。
つまりスクリプトが「0 件ですよ」と教えてくれればそれで良いのです。

(1)「 タスク一覧」レイアウトで検索する
(1-1) 「タスク一覧」レイアウトに切り替える
(1-2) 検索モードに切り替える
(1-3) 検索条件を入力する → 「ステータス」フィールドに「延期」を入力
(1-4) 検索を実行する
(1-5) 検索結果が表示される または 検索結果がなければ作業はここで終わり
(2) 印刷する
(3) 会議の参考資料にする

作業内容を変更しました。
この想定でスクリプトを検索エラーに対応するものに改善します。

レイアウト切り替え[タスク一覧(タスク管理)]
(1 行あける)
エラー処理[オン]
検索モードに切り替え[一時停止:オフ]
フィールド設定[タスク管理 :: ステータス;"延期"]

レコード/ 検索条件確定[ダイアログあり:オフ]
検索実行[ ]

If[Get(最終エラー)]
  
  カスタムダイアログを表示["検索結果なし" ; "検索結果がありませんでし
た。"]

Else
End If
エラー処理[オフ]

カスタムダイアログのオプションは次図を参照してください。「キャンセル」は削除します。

スクリプトを実行して動作を確認してみてください。

0 件の場合には、スクリプトがカスタムダイアログを表示して教えてくれるようになりました。
このように、検索は1 件以上の結果を必ず得る必要があるとは限りません。
結果が0 件なら、それでよいこともあります。

エラー処理に必要なスクリプトステップについて

検索結果が0 件であるというカスタムダイアログの表示と[エラー処理]スクリプトステップには、
どのような関係があるのでしょうか。

[エラー処理] スクリプトステップ

FileMaker Proの「標準のエラーメッセージ」を表示したくないときに使用します。
そして、どのようなエラーだったかを知るためにGet(最終エラー)関数を使います。

オプション:
[オン]エラーメッセージなどが表示されなくなります。
[オフ]エラーメッセージが表示されるようになります。

Get(最終エラー) 関数

直前のスクリプトステップの実行でエラーがあるかどうかがわかります。
結果の数字は「エラーコード」と呼ばれるFileMaker Pro のエラーの内容を表す数字です。
エラーの種類についてはヘルプを参照してください。

エラーなし 0 が返ります。
エラーあり 0 以外が返ります。

検索の場合、検索結果があることは「エラーがない」状態です。
今回のスクリプトでは『0 以外のエラーが返ってきた』=『エラーあり』=『検索結果が0件』という判断でダイアログを表示しています。

[If] スクリプトステップ

If 関数と同じ使い方をします。
論理計算式としてはGet(最終エラー)関数が0 以外を返すことを利用して、論理計算式の結果が「1」真(True)であると判断しています。

If [ ここに論理計算式を設定する]
  論理計算式の結果が「1」真(True)

End If

これが最もシンプルな使用方法です。

If [ ここに論理計算式を設定する]
 
  論理計算式の結果が「1」真(True)

Else
  論理計算式の結果が「1 以外」偽(False)

End If

これが一番よく使用される方法です。さらに[Else If]スクリプトステップもあります。

まとめ

スクリプトを作成する際には、『思ったような結果がえられる場合』だけでなく、『思ったような結果がえられない場合』も考えることが重要です。

開発を行う上で必要となる設計書や仕様書には

「[検索]ボタンをクリックすると、検索条件に合致したデータを一覧に表示すること」

という仕様は書かれていても

「[検索]ボタンをクリックすると、検索条件に合致したデータがない場合、ダイアログを表示すること」

という仕様は書かれていないことがあります。

これは、「設計漏れ」「仕様漏れ」とも言えますが、往々にして

『だいたいのシステムだったら、そういう仕様になっているよね?』

という 特定の人物の主観による暗黙の仕様 として扱われます。

こういった 暗黙の仕様 がないよう。
「依頼する側」、「開発する側」で認識のズレがないよう。
しっかりとエラー処理を考慮したシステムを設計を心がけましょう。

それでは、また次回の更新をお楽しみに!!

Follow me!