次の方法で共有


[方法] エラーを処理する方法

カスタム アプリケーションを作成するときに、開発者はエラー処理を行わなければならないことがよくあります。エラー処理では、アプリケーションで発生したエラーをチェックしたり、カスタム エラーを作成して発生させたりするプログラミング コードを記述します。Microsoft.Office.InfoPath 名前空間によって提供される InfoPath オブジェクト モデルでは、FormError クラスを FormErrorCollection クラスと共に使用するエラー処理がサポートされています。

InfoPath では、次のような場合にエラーが発生する可能性があります。

  • フォームに入力されたデータが XML スキーマの検証に失敗したとき。

  • カスタム検証の制約に違反があったとき。

  • XmlValidatingEventArgs イベント オブジェクトの ReportError メソッドによってエラーが生成されたとき。

  • FormErrorCollection クラスの Add メソッドを使用してエラーが作成されたとき。

FormErrorCollection クラスの概要

FormErrorCollection クラスには、次のメソッドとプロパティがあります。フォームの開発者は、これらを使用することにより、コレクションに含まれている FormError オブジェクトを管理できます。

名前 説明

Add メソッド (+3 オーバーロード)

FormError オブジェクトを作成し、それをコレクションに追加します。

Delete メソッド (+1 オーバーロード)

指定したユーザー定義エラーをコレクションから削除します。

DeleteAll メソッド

コレクションに含まれているすべての FormError オブジェクトを削除します。

GetErrors (+1 オーバーロード)

指定した名前または型のすべての FormError オブジェクトをコレクションから返します。

Count プロパティ

コレクションに含まれている ErrorObject オブジェクトの数を取得します。

Item プロパティ

指定したインデックス番号に基づく ErrorObject オブジェクトへの参照を取得します。

FormError クラスの概要

FormError クラスには、次のプロパティがあります。フォームの開発者は、これらを使用することにより、発生したエラーに関する情報にアクセスできます。

名前 説明

DetailedMessage プロパティ

FormError オブジェクトの詳細なエラー メッセージを取得または設定します。

ErrorCode プロパティ

FormError オブジェクトのエラー コードを取得または設定します。

Site プロパティ

FormError オブジェクトに関連付けられたノードにある XPathNavigator オブジェクトを取得します。

Message プロパティ

FormError オブジェクトの短いエラー メッセージを取得または設定します。

FormErrorType プロパティ

FormError オブジェクトの型を取得します。

FormErrorCollection クラスおよび FormError クラスを使用する

フォームに関連付けられた FormErrorCollection オブジェクトにアクセスするには、XmlForm オブジェクトの Errors プロパティを使用します。FormErrorCollection オブジェクトはフォームの基になる XML ドキュメントに関連付けられているため、エラーが発生した場合は、現在の XML ドキュメント内でそのエラーや追加のエラーにアクセスし、エラーを管理することができます。次の例では、ループを使用して、フォームの基になる XML ドキュメント内にあるエラーをチェックする方法を示します。エラーがある場合は、関数で各エラーをループ処理し、FormError オブジェクトの Message プロパティを使用して、ユーザーにメッセージ ボックスを表示します。

public void CheckErrors(XPathNavigator xmlNode)
{
   foreach(FormError err in this.Errors)
   {
      if(xmlNode.InnerXml == err.Site.InnerXml)
         MessageBox.Show("The following error has occured: "
             + err.Message);
   }
}
Public Sub CheckErrors(ByVal xmlNode As XPathNavigator)
   Dim err As FormError
   For Each err In Me.Errors
      If xmlNode.InnerXml = err.Site.InnerXml Then
         MessageBox.Show("The following error has occured: " _
             & err.Message)
   End If
End Sub

上の関数は、フォームのデータ検証イベント ハンドラの 1 つから呼び出すことができます。たとえば、フォーム内のフィールドの Changed イベントのイベント ハンドラで使用した場合、関数の呼び出しにより、次のように XmlEventArgs イベント オブジェクトの Site プロパティを使用して XML ノードが引数として渡されます。

CheckErrors(e.Site);
CheckErrors(e.Site)

InfoPath によって生成されるエラーの処理に加えて、フォームの開発者は、XmlValidatingEventArgs イベント オブジェクトの ReportError メソッド、または FormErrorCollection クラスの Add メソッドを使用して、カスタム エラーを生成することもできます。ReportError メソッドまたは Add メソッドの使用方法については、このトピックの先頭にあるそれぞれのメソッドのリンクをクリックしてください。

マネージ コードの例外を処理する

try-catch 例外処理を使用すると、次のコードに示すようにマネージ コード フォーム テンプレート内で発生した例外を処理することができます。

FileQueryConnection queryXMLFile = 
   (FileQueryConnection)this.DataConnections["form1"];
// Perform the query.
try
{
   queryXMLFile.Execute();
}

catch (Exception ex)
{
   MessageBox.Show("Failed to query." + System.Environment.NewLine 
      + ex.Message);
}
Dim queryXMLFile As FileQueryConnection = _
   DirectCast(Me.DataConnections("form1"), FileQueryConnection)
' Perform the query.
Try
   queryXMLFile.Execute();
Catch ex As Exception
   MessageBox.Show("Failed to query." & System.Environment.NewLine 
      & ex.Message)
End Try

フォーム コード内で try-catch 例外処理を使用していないと、デバッグ中およびプレビュー中に、未処理の例外に関する情報が InfoPath によって InfoPath のエラー ダイアログ ボックスに表示されます。また、既定では、マネージ コード フォーム テンプレートを展開した場合の実行時には、未処理の例外は Info Path エラー ダイアログ ボックスに表示されません。実行時に未処理の例外に関する情報を表示するには、次の手順を使用します。

未処理のマネージ コード例外の実行時の通知を有効にする

  1. InfoPath を開きます。

  2. [ツール] メニューの [オプション] をクリックします。

  3. [詳細設定] タブで、[Visual Basic または Visual C# コードのエラーを表示する] チェック ボックスをオンにします。