エラー処理は大きく 業務的なエラー処理 と 例外発生時(想定外)のエラー処理 に分けられます。 本記事では両者の考え方と実装・運用の要点を、具体例を交えて解説します。
仕様で明文化できる「期待からのズレ」を検出して、安全に やり直せる ・ 修正できる よう導くための処理です。
例えば、以下のような業務処理を考えてみます。
作業者が以下の処理を行う。
eDocArrangement2で以下の処理を行う。
このように処理で発生する可能性のある事象を、設計の段階で漏れなく予測・想像することが重要です。
順番に具体的なエラー処理を実装していきます。
アノテーション取得1でテキストを正規表現検索する条件を追加して、正規表現の値に「受注日:([0-9/]+)」と入力した場合、以下のマクロで受注日:の後ろの日付が取得できます。
{%GET_U(DWアノテーション取得1,1,CapturedTexts,1,1)}
取得した文字をユーザーデータ(属性,受注日)にセットします。
{%SET_U(属性,受注日,{%GET_U(DWアノテーション取得1,1,CapturedTexts,1,1)})}
アノテーションが見つからない場合や数字と/以外の文字の場合は空文字になるので、条件文で空文字の判定を行います。
#受注日が空の場合は判定をFalseに設定 {%IF({%GET_U(属性,受注日)}=, {%SET_U(属性,判定,False)} ,)}
空文字以外の場合は日付形式と判断してよいでしょうか?
例えば2025/13/1のように12をタイプミスして13になっているようなケースも考えられます。そのようなデータもエラーとして検出するために日付形式判定マクロ(IS_DATE)を用意しています。
そして日付形式判定がTrueなら文書属性にセットします。
#アノテーションから取得した値をユーザーデータにセットする {%SET_U(属性,受注日,{%GET_U(DWアノテーション取得1,1,CapturedTexts,1,1)})} #受注日が空の場合は判定をFalseに設定 {%IF({%GET_U(属性,受注日)}=, {%SET_U(属性,判定,False)} , #受注日が空でない場合 {%IF({%IS_DATE({%GET_U(属性,受注日)})}=True, #受注日が日付形式である場合 {%SET_U(属性,判定,True)} #受注日を文書属性に設定 {%DW_SET_DOCUMENT_ATTRIBUTE({%DW_GET(OpenName)},受注日,{%GET_U(属性,受注日)},Date)} , #受注日が日付形式でない場合 {%SET_U(属性,判定,False)} )} )}
このようなマクロにすることで、受注日の入力チェックを行って日付形式である場合のみ文書属性に設定されるので文書属性登録時の形式エラーが発生しなくなります。
また、「{%GET_U(属性,判定)}」を条件分岐の条件にすれば、移動処理で正常な場合とエラーの場合で処理を分岐できます。
入力ファイルは他のアプリケーションがプログラムで付与するので、毎回必ず同じフォーマットになるのであれば、エラーチェックは行わなくてもよいでしょう。
ファイル破損、ネットワーク断、ディスク障害など、通常は起こらない想定外のエラーに対する処理です。
例外エラーはプログラミングにおいて、とても対策が難しい現象です。プログラミングは論理的な考えに基づいて組み立てていきますが、例外エラーはハードの故障・不調などアナログ的に発生する場合があるので、すべての例外エラーに対応するのは極めて難しいです。
そのため、一般的なプログラム言語ではプログラムを広域にグループ化して、そのグループ内で発生した例外エラーを1か所で検知するtry~catch構文を実装しているものが多くあります。
eDocArrangement2でもファイルループなどの処理単位でtry~catch構文を使って例外エラーを検出できるようにしています。
条件分岐処理で「エラー回数で判定」を選択すると条件分岐の前で発生したエラーの有無で条件分岐できます。
下図のような設定では、XDW文書オープン1~XDW文書クローズ1までの処理のどこかでエラーが発生した場合に、対象ファイルをエラーフォルダに移動するようにする場合、文書クローズ1の直後に条件分岐を挿入すればよいです。
以下のように満たしている場合の処理に、業務処理のエラー判定の条件分岐を配置します。また、満たしていない場合の処理にエラーフォルダへの文書移動の処理を追加します。
このように例外エラー発生時の処理を用意しても、入力のファイルやフォルダ、出力フォルダへのアクセスが不能となった場合は、エラーフォルダに移動するファイル移動3の処理が失敗します。
そうなると、エラー処理が失敗した場合のエラー処理を行うようにするのか検討することになります。
そもそも例外エラーはハードが堅牢に動作していれば発生しません。まれに発生する問題に対してどこまでコストをかけるかという設計の話になります。
例えば、飛行機や電車などの交通インフラや医療機器などの人の生命にかかわるようなシステムは、ハードウエア、ソフトウエア共に、何重にも対策を行って障害対策を行っていますが、それでも100%障害が発生しないシステムを作るのは不可能だと思います。
そして対策を行うにはコストがかかります。プログラムであれば仕様の追加と実装、テストなどの費用がかかります。
まれに発生するかもしれない、発生しないかもしれない処理のためにどれだけ時間とお金を使って対策を行うかユーザー様と一緒に考えてみてください。
eDocArrangement2では メールサーバー設定 でメールサーバーを登録しておくと、以下のマクロでメールを送信することができます。
{%SET_U(宛先,1,tom@test.com)} {%SEND_MAIL(メールサーバー1,宛先,jerry@test.com,,,eDocArrangement2通知,例外エラーを検知しました。ログを確認してください。)}
例外エラーはハードディスクが故障するなど、忘れた頃に発生したりしますので、メール通知でお知らせするのは有効な手段かと思います。
但し、メールはメールサーバーやインターネットを使いますので、そこで障害が発生している場合にはメールが送信先に届かない可能性もあります。ここでもまた、どこまで対処を行うか検討が必要です。